Firebird + IBX: проблемы с timestamp и TDateTimeField
Модератор: kdv
Firebird + IBX: проблемы с timestamp и TDateTimeField
Перевожу программу, успешно проработавшую 5 лет под разными версиями InterBase, на Firebird 2.0 RC4.
Возникла проблема c типом timestamp и соответствующим ему TDateTimeField в программе.
1.Генерируется update SQL, в который в WHERE добавляются условия для полей, которые
изменились. Что-то наподобие:
update table_name
set timestamp_field = current_timestamp
where timestamp_field = :old_timestamp_field and ...;
2. При изменении в программе поля типа timestamp (через TDateTimeField) в Firebird этот update
не обновляет запись, получаю ошибку "Update failed".
3. Причина - функция current_timestamp в InterBase не возвращает доли секунды (всегда нули),
а в Firebird - возвращает. Кто не верит, выполните для обеих баз:
select cast( current_timestamp as varchar(32) ) from rdb$database;
Дальше, если посмотреть в логе, какой параметр реально подставляется при выполнении вместо
:old_timestamp_field, то увидим, что это дата + время, без долей секунд, т.к. TDateTimeField их
и не должен содержать.
Вот и получается, если в базе timestamp уже с долями секунды, то условие
timestamp_field = :old_timestamp_field эту запись не выберет.
Что по этому поводу скажут специалисты?
P.S. Попытка вместо TDateTimeField использовать TSQLTimeStampField не увенчалась успехом,
т.к. IBX говорит, что ожидал SQLTimeStamp, а реально получил DateTime.
Возникла проблема c типом timestamp и соответствующим ему TDateTimeField в программе.
1.Генерируется update SQL, в который в WHERE добавляются условия для полей, которые
изменились. Что-то наподобие:
update table_name
set timestamp_field = current_timestamp
where timestamp_field = :old_timestamp_field and ...;
2. При изменении в программе поля типа timestamp (через TDateTimeField) в Firebird этот update
не обновляет запись, получаю ошибку "Update failed".
3. Причина - функция current_timestamp в InterBase не возвращает доли секунды (всегда нули),
а в Firebird - возвращает. Кто не верит, выполните для обеих баз:
select cast( current_timestamp as varchar(32) ) from rdb$database;
Дальше, если посмотреть в логе, какой параметр реально подставляется при выполнении вместо
:old_timestamp_field, то увидим, что это дата + время, без долей секунд, т.к. TDateTimeField их
и не должен содержать.
Вот и получается, если в базе timestamp уже с долями секунды, то условие
timestamp_field = :old_timestamp_field эту запись не выберет.
Что по этому поводу скажут специалисты?
P.S. Попытка вместо TDateTimeField использовать TSQLTimeStampField не увенчалась успехом,
т.к. IBX говорит, что ожидал SQLTimeStamp, а реально получил DateTime.
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Тогда закатывай рукава, бери напильник и обработай им IBX. По этим долям секунды широкие массы дружно страдали много лет и наконец-то выпросили. Ты попал в категорию, которая "попала". Такая категория всегда бывает, к сожалению.gvy писал(а):Я бы так и сделал, но нету ни времени, ни желания кардинально менять старую отлаженную программу, и за это никто не даст денег. Жду ответов по существу.
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
изменения только вместе с новыми версиями дельфей. Политика вполне понятная.Что-то с момента выхода IBX 6.08 прошло слишком много времени.
официального сайта ibx не существует, т.к. ibx это часть софта Borland. То есть, официальный сайт IBX тут:
http://codecentral.borland.com/Author.aspx?ID=102
добавлю, что в IBX для D2006 в плане timestamp вроде бы все то же самое.
в общем, если не нужны миллисекунды - резать в триггере или в запросе, при помощи самописной udf.
с now та же история - то есть, миллисекунды теперь везде. Вот же ж блин, благими намерениями...
Причем, на fb2 таким образом перестанут работать все приложения, которые работают в IBX (как минимум. Бузаджи сейчас FIBPlus проверяет на эту тему) и других драйверах, которые миллисекунды в timestamp не учитывают (по разным причинам).
так что я за возврат старой функциональности и введение нестандартного current_timestampmsec
с now та же история - то есть, миллисекунды теперь везде. Вот же ж блин, благими намерениями...
Причем, на fb2 таким образом перестанут работать все приложения, которые работают в IBX (как минимум. Бузаджи сейчас FIBPlus проверяет на эту тему) и других драйверах, которые миллисекунды в timestamp не учитывают (по разным причинам).
так что я за возврат старой функциональности и введение нестандартного current_timestampmsec
кстати, о птичках. существующие 15 лет в IB миллисекунды - не миллисекунды, а десятые миллисекунд. Потому что миллисекунды, это 0.nnn. Я не знаю, как дело с форматированием времени в других языках, поэтому прошу прокомментировать.
то есть, я не знаю, как стандартными средствами в Delphi ввести или вывести десятые миллисекунды. StrToDateTime работает в пределах стандартного формата миллисекунд - zzz.
p.s. что IBX миллисекунды обрезает - это уже другой вопрос.
то есть, я не знаю, как стандартными средствами в Delphi ввести или вывести десятые миллисекунды. StrToDateTime работает в пределах стандартного формата миллисекунд - zzz.
p.s. что IBX миллисекунды обрезает - это уже другой вопрос.