Я использую ADODB для взаимодействия между моим php-кодом и моими таблицами FoxPro .dbf. Вот строка подключения и открытие RecordSet, который я использую для обновления таблицы
$this->dbConnection->Open('Provider=VFPOLEDB.1;CursorType=2;Data Source="{path}";');
$this->recordSet->Open($sqlStr, $this->dbConnection, 3);
После открытия набора записей и выбора некоторых записей мне нужно обновить значения в RecordSet, а затем сохранить эти изменения обратно в таблицу, но я не могу понять, какой формат / тип использовать при использовании метода «Обновление» набора записей Ado. Я не хочу использовать оператор SQL UPDATE по ряду причин — в этом случае использовать пакетное обновление.
Строка, которая не работает, когда тип данных поля FoxPro имеет тип DateTime / Date / Time, выглядит следующим образом:
$this->recordSet->Update('fieldName', $value);
Я пробовал это с переменной ‘value’, равной:
"{//::}" or 'CTOT("{//::}")'
и ни одна из этих работ. Я просто получаю сообщение об ошибке «Многошаговая операция генерирует ошибки. Проверьте каждое значение состояния». в:
com->Update('tcdate', '{//::}')
Любые идеи о том, как отформатировать значение DateTime / Date в php, чтобы соединение Ado принимало его? Спасибо!
ОБНОВИТЬ
После дальнейшего тестирования это, кажется, проблема только с пустыми / пустыми значениями даты. При использовании метода update он работает нормально, пока значение не включает в себя фигурные скобки вокруг него, как это необходимо в реальном операторе SQL. т.е. это работает:
$this->recordSet->Update('dateField', '2016-01-21 02:10:48 PM');
Кроме того, чтобы добавить новую запись, необходимо указать значение для всех полей, поэтому, насколько я могу судить, невозможно добавить новую запись с пустым значением даты через AddNew. Следующий сбой, если в этой записи также есть поле типа Date.
ADO основан на ANSI, и там нет понятия «пустая дата». Вместо этого в вашей таблице задайте поля date / datetime для принятия значений NULL и просто не отправляйте никаких значений для этих полей и не отправляйте NULL явно.
Другой альтернативой может быть выполнение «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');