-
База Firebird, подключаюсь через ODBC, использую ADO проблема с датами и временем (тип Date, Time) Restricted data type attribute violation при операции вида ADOComand.Parameters[0].DataType:=ftDate;
ADOComand.Parameters[0].Value:=Now;
ADOComand.Execute; если передавать строку то сработает ADOComand.Parameters[0].Value:=DateTimeToStr(Now); но из-за разници форматов даты клиента и сервера (dd.MM.yyyy и MM.dd.yyyy) меняются день с месяцем Как победить проблему?
-
DataType:= ftDateTime попробуй.
-
а параметру всеравно ftDate сбрасывает на ftDateTime что DataType:=ftDate Value:=Now; что Value:=Now; DataType:=ftDate ЛОГ: UPDATE ADV SET ID= :ID,NAME= :NAME,CHANGE_DATE= :CHANGE_DATE,CHANGE_TIME= :CHANGE_TIME,IS_DELETED= :IS_DELETED WHERE (REPLIC_ID= :REPLIC_ID);
ID=2(ftInteger)
NAME=ТВ(ftString)
CHANGE_DATE=20.03.2010 4:16:34(ftDateTime)
CHANGE_TIME=20.03.2010 4:16:34(ftDateTime)
IS_DELETED=0(ftSmallint)
REPLIC_ID=(ftString)
-
поборол так прямым присвоением ADO в обход дельфевой обертки ADOComand.Parameters[0].ParameterObject.Value:=Now;
ADOComand.Parameters[0].ParameterObject.Type_:=adDBDate;
-
т.е. чтобы работало нужно было задавать с глюком?... шаман.
Now возвращает значение типа TDateTime со временем, явное приписывание типа (в общем то не нужное) задает тип дата, без времени. и это так и нужно? однако...
-
исследование показало что виновник находится в ADODB.DataTypeValues DataTypeValues: array[TDataType] of TOleEnum = (
adEmpty, adVarChar, adSmallint, adInteger, adUnsignedSmallint,
adBoolean, adDouble, adDouble, adCurrency, adDate, adDate,
adDate, adBinary,... т.е. любой тип даты времени дельфи (ftDate, ftTime, ftDateTime) приравнивался к ADOтипу дата (adDate) ParameterObject.Type_ := DataTypeValues[Value]; ручное присваивание вроде ParameterObject.Type_:=adDBTimeStamp; решило проблему
-
> Slym (20.03.2010 00:23:00) [0]
Интересно, а зачем ты время превращаешь в строку, что бы затем строку превратить во время. Не надо так.
-
> ручное присваивание вроде ParameterObject.Type_:=adDBTimeStamp; решило проблему ну вот это совсем другое дело, и это практически то, что советовал в [1]
> т.е. любой тип даты времени дельфи (ftDate, ftTime, ftDateTime) приравнивался к ADOтипу дата (adDate) почему тогда нет проблем у остальных? могу только предположить, что не все драйверы к этому чувствительны, а то может и специально сделано (исходно то делалось под MSSQL, а ему может пифигу/либо он только один тип признавал)
-
> Интересно, а зачем ты время превращаешь в строку, что бы > затем строку превратить во время. > Не надо так.
это где? вариант со строкой я не рассматривал всерьез, грабли с конвертациями/форматами мною приведены [0] и "идеологически" неверно... вообще в итоге вся логика у меня в строках (т.к. прога экспорт/импорт в xml) > почему тогда нет проблем у остальных?
может большинство не пользует ODBCFireBirdDriver, а пользуют нативный FIB+ или IBProvider... сменить способ доступа к ДБ мне нельзя только ADO-ODBC-Firebird
-
> это где?
Тренируем память ADOComand.Parameters[0].Value:=DateTimeToStr(Now);
|