Форум: "Основная";
Текущий архив: 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