Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.14;
Скачать: CL | DM;

Вниз

Ошибка в исходниках IBCustomDataSet или в SysUtils?   Найти похожие ветки 

 
КаПиБаРа ©   (2004-11-01 06:48) [0]

Предыстория:
В таблице базы (Firebird) определено поле типа Time. При попытке добавления значений поля в таблицу получаю ошибку EConvertError. Начал разбираться откуда ноги растут и набрел на такой интересный код.

При добавлении записи вызывается процедура SetInternalSQLParams из модуля IBCustomDataSet. Для поля типа SQL_TYPE_TIME значение задается преобразуется из TimeStamp, значение которого задается тут же. Обратите внимание на строчку ts.Date := 0; в которой задается "нулевой" день.

procedure TIBCustomDataSet.SetInternalSQLParams(Qry: TIBSQL; Buffer: Pointer);
var
 i, j: Integer;
 cr, data: PChar;
 fn, st: string;
 OldBuffer: Pointer;
 ts: TTimeStamp;
begin
...
           case rdFields[j].fdDataType of
...
           SQL_TYPE_TIME:
           begin
             ts.Date := 0;
             ts.Time := PInt(data)^;
             Qry.Params[i].AsTime :=
               TimeStampToDateTime(ts);
           end;
...


Далее переходим к модулю SysUtils, в котором и рассматриваем код процедуры TimeStampToDateTime. Видим что в процедуре происходит вызов ValidateTimeStamp. Что же там проверяется?

function TimeStampToDateTime(const TimeStamp: TTimeStamp): TDateTime;
asm
       PUSH    EBX
{$IFDEF PIC}
       PUSH    EAX
       CALL    GetGOT
       MOV     EBX,EAX
       POP     EAX
{$ELSE}
       XOR     EBX,EBX
{$ENDIF}
       PUSH    EAX
       CALL    ValidateTimeStamp
...


А проверяется там, то что значение полей записи TimeStamp не выходило за границы допустимого диапазона. В том числе день не должен быть меньше или равен 0.

procedure ValidateTimeStamp(const TimeStamp: TTimeStamp);
begin
 if (TimeStamp.Time < 0) or (TimeStamp.Date <= 0) then
   ConvertErrorFmt(@SInvalidTimeStamp, [TimeStamp.Date, TimeStamp.Time]);
end;

Таким образом получается что при работе с полем Time будет всегда происходить ошибка.

Вот хотелось бы узнать в D7 что то изменилось? И как по вашему в каком из 2-х модулей была допущена ошибка?


 
КаПиБаРа ©   (2004-11-01 13:09) [1]

Никто не сталкивался с этим и никаких мыслей нет?


 
REA   (2004-11-01 13:32) [2]

D7:

SQL_TYPE_DATE:
           begin
             ts.Date := PInt(data)^;
             ts.Time := 0;
             Qry.Params[i].AsDate :=
               TimeStampToDateTime(ts);
           end;
           SQL_TYPE_TIME:
           begin
             ts.Date := 1;
             ts.Time := PInt(data)^;
             Qry.Params[i].AsTime :=
               TimeStampToDateTime(ts);
           end;


 
Sergey_Masloff   (2004-11-01 13:37) [3]

КаПиБаРа ©   (01.11.04 13:09) [1]
>Никто не сталкивался с этим и никаких мыслей нет?
Есть мысли использовать нормальные версии компонент.
Это в D5:

 SQL_TYPE_TIME:
           begin
             ts.Date := 1;
             ts.Time := PInt(data)^;
             Qry.Params[i].AsTime :=
               TimeStampToDateTime(ts);
           end;


 
КаПиБаРа ©   (2004-11-01 13:56) [4]

А в D6 как этот код выглядит? Это только у меня или у всех так?



Страницы: 1 вся ветка

Текущий архив: 2004.11.14;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.047 c
8-1092301028
tarantino
2004-08-12 12:57
2004.11.14
видеопоток из устройст ввода видео


9-1090017048
Virtual GOD
2004-07-17 02:30
2004.11.14
Вопрос по движку


14-1098989890
Alein
2004-10-28 22:58
2004.11.14
Интеграция драйверов в дистрибутив Windы


4-1096885733
drew
2004-10-04 14:28
2004.11.14
Удаление значения ключа из реестра


1-1099031587
Devel
2004-10-29 10:33
2004.11.14
Unicode