2016-01-21 284 views
1

我使用ADODB來連接我的php代碼和我的FoxPro .dbf表。這裏是連接字符串和我使用更新表ADODB更新方法更新FoxPro日期/日期時間字段

$this->dbConnection->Open('Provider=VFPOLEDB.1;CursorType=2;Data Source="{path}";'); 
$this->recordSet->Open($sqlStr, $this->dbConnection, 3); 

打開記錄,並選擇一些記錄後Recordset的開放,我需要RecordSet中更新的值,然後保存這些更改回到表中,但我無法弄清楚在使用Ado的Recordset'Update'方法時要使用的格式/類型。我不想使用sql UPDATE語句有很多原因 - 在這種情況下可以利用批量更新。

每當FoxPro的字段數據類型爲日期時間/日期/時間不工作的一行是這樣的:

$this->recordSet->Update('fieldName', $value); 

我與「價值」變量等於試了一下:

"{//::}" or 'CTOT("{//::}")' 

而這些工作都沒有。我剛剛收到錯誤「多步驟操作產生的錯誤,檢查每個狀態值。」在:

com->Update('tcdate', '{//::}') 

有關如何在php中設置DateTime/Date值的格式,以便Ado連接接受它的任何想法?謝謝!

UPDATE

進一步的測試之後,這似乎只是空白/空的日期值的問題。在使用update方法時,只要該值不包括它在實際SQL語句中需要的花括號,它就可以正常工作。即這個工程:

$this->recordSet->Update('dateField', '2016-01-21 02:10:48 PM'); 

此外,添加一個新的記錄,所有字段的值必須指定,因此無法就增加一個新的記錄通過的AddNew空白日期值,因爲我可以告訴。如果該記錄中還存在Date類型字段,則以下操作將失敗。

回答

0

所以我想我想出瞭如何做到這一點。我曾嘗試使用下面的行,沒有工作,只是給了一個錯誤。

$this->recordSet->Update('dateField', '0000-00-00 00:00:00 AM'); 

但是,以下幾行分別對datetime和date字段起作用,並在表中產生一個「空白」字段。

$this->recordSet->Update('dateField', '0000-01-01 00:00:00 AM'); 
$this->recordSet->Update('dateField', '0000-01-01'); 
3

ADO是基於ANSI的,並且在那裏沒有「空白日期」概念。相反,在你的表中設置你的日期/日期時間字段接受空值,並且不要爲這些字段發送任何值或顯式地發送空值。 另一種方法是,在同一個連接上執行「SET NULL OFF」。當你這樣做的時候,你沒有通過的任何字段都會填充它們的「默認空白」值(0表示數字,{}表示日期等)。

更新字段'0000-01-01'只是要求麻煩(最近我不得不面對一個客戶的桌子讓人頭疼,事實證明,有人做了同樣的事情,使桌子處於不可用狀態 - 很難趕上和修復)。

+0

感謝您的洞察力。我一定會看看SET NULL OFF。儘管它「有效」,但我不喜歡我提出的解決方案。這是hacky的方式..我只是尋找一種方法來做到這一點,而不使用真正的空值,因爲這會影響很多其他地方。 –