我正在使用ADODB来连接我的php代码和我的FoxPro .dbf表。这是连接字符串和我用于更新表的RecordSet的开头
$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字段数据类型为DateTime / Date / Time时不起作用的行是:
$this->recordSet->Update('fieldName', $value);
我尝试过'value'变量等于:
"{//::}" or 'CTOT("{//::}")'
并且这些都不起作用。我只是得到错误“多步操作产生错误。检查每个状态值。”于:
com->Update('tcdate', '{//::}')
有关如何格式化php中的DateTime / Date值以便Ado连接接受它的任何想法?谢谢!
更新
经过进一步测试,这似乎只是空白/空日期值的问题。使用更新方法时,只要该值不包含在实际SQL语句中需要的大括号,它就可以正常工作。即这是有效的:
$this->recordSet->Update('dateField', '2016-01-21 02:10:48 PM');
此外,要添加新记录,必须指定所有字段的值,因此就我所知,无法通过AddNew添加具有空白日期值的新记录。如果该记录中还有日期类型字段,则以下操作失败。
答案 0 :(得分:3)
ADO是基于ANSI的,那里没有“空日期”概念。相反,在您的表中设置您的日期/日期时间字段以接受空值,并且不会为这些字段发送任何值或显式发送null。 另一种选择是在同一连接上执行“SET NULL OFF”。执行此操作时,您未传递的任何字段都会填充其“默认空白”值(0表示数字,{}表示日期等。)
使用'0000-01-01'更新字段只是在寻找麻烦(最近我不得不处理客户的表格令人头疼,事实证明有人做了同样的事情,将表格置于无法使用的状态 - 难以捕捉和修复。
答案 1 :(得分: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');