Конференция "Базы" » проблема с датами и временем в ADOComand [D7, Firebird2]
 
  • Slym © (20.03.10 00:23) [0]
    База 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) меняются день с месяцем

    Как победить проблему?
  • sniknik © (20.03.10 00:39) [1]
    DataType:= ftDateTime
    попробуй.
  • Slym © (20.03.10 00:47) [2]
    а параметру всеравно 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={13F36713-3584-407E-839B-FF2462AE93E6}(ftString)

  • Slym © (20.03.10 01:33) [3]
    поборол так прямым присвоением ADO в обход дельфевой обертки
    ADOComand.Parameters[0].ParameterObject.Value:=Now;
    ADOComand.Parameters[0].ParameterObject.Type_:=adDBDate;

  • sniknik © (20.03.10 07:49) [4]
    т.е. чтобы работало нужно было задавать с глюком?... шаман.

    Now возвращает значение типа TDateTime со временем, явное приписывание типа (в общем то не нужное) задает тип дата, без времени. и это так и нужно? однако...
  • Slym © (20.03.10 09:27) [5]
    исследование показало что виновник находится в
    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; решило проблему
  • Anatoly Podgoretsky © (20.03.10 09:35) [6]
    > Slym  (20.03.2010 00:23:00)  [0]

    Интересно, а зачем ты время превращаешь в строку, что бы затем строку превратить во время.
    Не надо так.
  • sniknik © (20.03.10 09:42) [7]
    > ручное присваивание вроде ParameterObject.Type_:=adDBTimeStamp; решило проблему
    ну вот это совсем другое дело, и это практически то, что советовал в [1]

    > т.е. любой тип даты времени дельфи (ftDate, ftTime, ftDateTime) приравнивался к ADOтипу дата (adDate)
    почему тогда нет проблем у остальных? могу только предположить, что не все драйверы к этому чувствительны, а то может и специально сделано (исходно то делалось под MSSQL, а ему может пифигу/либо он только один тип признавал)
  • Slym © (20.03.10 11:11) [8]

    > Интересно, а зачем ты время превращаешь в строку, что бы
    > затем строку превратить во время.
    > Не надо так.

    это где?
    вариант со строкой я не рассматривал всерьез, грабли с конвертациями/форматами мною приведены [0] и "идеологически" неверно...
    вообще в итоге вся логика у меня в строках (т.к. прога экспорт/импорт в xml)
    > почему тогда нет проблем у остальных?

    может большинство не пользует ODBCFireBirdDriver, а пользуют нативный FIB+ или IBProvider... сменить способ доступа к ДБ мне нельзя только ADO-ODBC-Firebird
  • Anatoly Podgoretsky © (20.03.10 14:06) [9]

    > это где?

    Тренируем память
    ADOComand.Parameters[0].Value:=DateTimeToStr(Now);

 
Конференция "Базы" » проблема с датами и временем в ADOComand [D7, Firebird2]
Есть новые Нет новых   [134432   +19][b:0][p:0.001]