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


ADODB Update Method updating FoxPro Date/Datetime fields

我正在使用ADODB在我的php代码和FoxPro .dbf表之间进行接口。下面是连接字符串和我用于更新表的记录集的打开

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

打开 recordSet 并选择一些记录后,我需要更新 RecordSet 中的值,然后将这些更改保存回表中,但我无法弄清楚使用 Adobe 的记录集"更新"方法时要使用的格式/类型。出于多种原因,我不想使用 sql UPDATE 语句 - 在这种情况下,可以利用批量更新。

每当 FoxPro 字段数据类型为日期时间/日期/时间时,不起作用的行是这样的:

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

我已经尝试过使用等于的"值"变量:

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

这些都不起作用。我只是收到错误"多步骤操作生成错误。检查每个状态值。

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

关于如何在 php 中格式化日期时间/日期值以便 Ado 连接接受它的任何想法?谢谢!

更新

经过进一步测试,这似乎只是空白/空日期值的问题。使用 update 方法时,只要值不像实际 SQL 语句中那样包含大括号,它就可以正常工作。即这有效:

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

此外,要添加新记录,必须为所有字段指定一个值,因此据我所知,无法通过 AddNew 添加具有空白日期值的新记录。如果该记录中还有"日期类型"字段,则以下内容将失败。

ADO 是基于 ANSI 的,那里没有"空日期"概念。相反,在表中将日期/日期时间字段设置为接受空值,并且根本不为这些字段发送任何值或显式发送空值。另一种选择是在同一连接上执行"SET NULL OFF"。执行此操作时,未传递的任何字段都将填充其"默认空白"值(0 表示数字,{} 表示日期等)。

用'0000-01-01'更新字段只是在自找麻烦(最近我不得不处理一个客户的桌子,让人头疼,结果发现有人做了你所做的同样的事情,把桌子放在不可用的状态 - 很难抓住和修复)。

所以我想我想出了如何做到这一点。我尝试使用以下行,但不起作用,只是给出了一个错误。

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

但是,以下行分别适用于日期时间和日期字段,并导致表中出现"空"字段。

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