ADODB更新方法更新FoxPro日期/日期时间字段

问题描述:

我使用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类型字段,则以下操作将失败。

所以我想我想出了如何做到这一点。我曾尝试使用下面的行,没有工作,只是给了一个错误。

$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'); 

ADO是基于ANSI的,并且在那里没有“空白日期”概念。相反,在你的表中设置你的日期/日期时间字段接受空值,并且不要为这些字段发送任何值或显式地发送空值。 另一种方法是,在同一个连接上执行“SET NULL OFF”。当你这样做的时候,你没有通过的任何字段都会填充它们的“默认空白”值(0表示数字,{}表示日期等)。

更新字段'0000-01-01'只是要求麻烦(最近我不得不面对一个客户的桌子让人头疼,事实证明,有人做了同样的事情,使桌子处于不可用状态 - 很难赶上和修复)。

+0

感谢您的洞察力。我一定会看看SET NULL OFF。尽管它“有效”,但我不喜欢我提出的解决方案。这是hacky的方式..我只是寻找一种方法来做到这一点,而不使用真正的空值,因为这会影响很多其他地方。 –