Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];

Вниз

Ошибка в исходниках 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.031 c
3-1097746322
Настенька
2004-10-14 13:32
2004.11.14
Ширина столбцов


14-1098424495
Polevi
2004-10-22 09:54
2004.11.14
зенит чемпион


1-1098944110
П7
2004-10-28 10:15
2004.11.14
Почему ошибка?


14-1098383173
SviL
2004-10-21 22:26
2004.11.14
Хочу найти компоненты


14-1098695499
Buch
2004-10-25 13:11
2004.11.14
Delpi 8





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский