Главная страница
    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.039 c
1-1099152138
Tria
2004-10-30 20:02
2004.11.14
Как в TBitBtn отловить момент после создания формы?


3-1097733194
sanek
2004-10-14 09:53
2004.11.14
как создать таблицу с полем memo?


14-1098657565
Profi
2004-10-25 02:39
2004.11.14
Заболел!!!


1-1099300677
Горбатов В.Ю.
2004-11-01 12:17
2004.11.14
Реакция на нажатие кнопки


1-1098885982
Kolan
2004-10-27 18:06
2004.11.14
Как работать с дву мерным массивом





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский