dbExpress не считывает миллисекунды в полях TimeStamp

В последнее время отображаются некоторые приложения Delphi / InterBase

«Запись не найдена или не изменена другим пользователем»

Они используют компоненты по умолчанию TSQLQuery / TClientDataSet (или TSimpleDataSet) dbExpress.

Мы обнаружили, что в таблице базы данных поле с миллисекундами сохранялось приложением, не относящимся к dbExpress.

Похоже, что dbExpress не считал миллисекунды из БД и не использовал это усеченное значение в условии «где» SQL-оператора таблицы обновления, поэтому не было соответствующей записи для обновления.

Обновление: мы используем поля TSQLTimeStamp в приложении Delphi. Обработчики OnBeforePost не изменяют значение поля.

Обновление 2

Как видно из IBExternals.pas, PCTimeStructure не имеет доли миллисекунд. Так что «по замыслу» нет поддержки миллисекунд для InterBase в Delphi (2009).

Кто-нибудь знает, добавлена ​​ли поддержка ms в более поздней версии Delphi?


person mjn    schedule 11.03.2011    source источник
comment
См. Также: forum.embarcadero.com/thread.jspa?threadID=109177&tstart=0   -  person mjn    schedule 16.10.2014


Ответы (3)


Я предполагаю, что это isc_decode_timestamp Interbase / Firebird client API, который не поддержка миллисекунд. Здесь есть проблема, связанная с трекером Firebird.

Обновление: также см. ответ.

person Ondrej Kelle    schedule 11.03.2011
comment
IBExpert правильно отображает миллисекундную часть данных, поэтому я думаю, что это исправлено в клиентской библиотеке InterBase. - person mjn; 11.03.2011
comment
Хорошо, теперь я вижу это в IBExternals.pas - PCTimeStructure не имеет миллисекундной части. Так что «по замыслу» нет поддержки миллисекунд для InterBase в Delphi (2009 г.): P - person mjn; 11.03.2011
comment
IBExpert просто не использует API. Я думаю, они используют FIBPlus, который использует PISC_QUAD (FXSQLVAR ^ .sqldata) ^ для получения временных меток. - person Ondrej Kelle; 11.03.2011
comment
ответ «почти» правильный - на самом деле клиентский API InterBase / Firebird поддерживает временные метки, но Delphi использует вызов функции API, который не включает миллисекунды ... - person mjn; 11.03.2011
comment
@mjn Драйвер Firebird DBX использует конкретный API, который не поддерживает миллисекунды с отметкой времени, вот в чем проблема. Про IB / FB API вообще ничего не сказал. - person Ondrej Kelle; 11.03.2011

Не знаю dbexpress достаточно хорошо, чтобы сказать так или иначе, но это может быть база данных, которая выполняет обрезку. Я знаю, что, например, SQL-сервер сбрасывает переданные ему миллисекунды. Вы можете попробовать столбцы TIMESTAMP вместо DATETIME (не уверен в точных именах). Возможно, столбцы TIMESTAMP имеют разрешение в миллисекундах в используемой вами базе данных.

person Marjan Venema    schedule 11.03.2011
comment
Значения базы данных верны (с точностью до миллисекунд). Я обновил все записи, чтобы установить миллисекунды на ноль, теперь приложение работает. Пока не будет патч, мы должны изменить другое приложение, которое (правильно) записывает значения отметок времени с миллисекундами. - person mjn; 11.03.2011

var
  tmpDTS: string;
  tmpDT: TDateTiume;

DateTimeToString(tmpDTS,'yyyy"."mm"."dd" "hh"."nn"."ss" "zzz',tmpDT);

В этом формате я вставляю запись в таблицу Firebird (через TSQLQuery), и Flamerobin показывает точное значение.

Вместо этого, если я вставляю значение с помощью параметра TDateTime, миллисекунды усекаются. DBGrid показывает усеченные значения.

Delphi XE, Db Express, драйвер Firebird, Firebird 2.5.1.

person Massimo    schedule 13.07.2012
comment
Да, я понимаю, что выполнение DSQL напрямую обходит усечение. Это обходной путь. - person mjn; 13.07.2012