Форум: "Базы";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];
ВнизОшиби данных при записи через TBlobStream Найти похожие ветки
← →
mrcat (2003-06-03 16:28) [0]Добрый день!
В базе хранятся данные в BLOB-полях.
Процедура записи выглядит следующим образом:
with qreMarkets do
begin
Edit;
StrmBlob := CreateBlobStream(FieldByName("Classes"), bmWrite);
tmpStr := SavePxToDB;
with Strm do
try
Size := 0;
Position := Size;
Write(Pointer(tmpStr)^, Length(tmpStr));
finally
Destroy;
end;
end;
где,qreMarkets
---TQuery
+TUpdateSQL
;
SavePxToDB
--- функция, возвращающая значение типа string, формируемое "склейкой" значений вида:
function DigitsToStrFix(const Data: integer): string;
begin
SetString(result, PChar(@Data), SizeOf(integer));
end;
Запись проходит без ошибок, но при считывании данные не соответствуют записанным.
Пробовал записьSavePxToDB
с помощью обычного файлового потока, минуяTBlobStream
--- всё верно!
Читаю и записываю черезTFileStream
следующим образом:
procedure WriteEx(const FileName, Data: string);
begin
with TFileStream.Create(FileName, fmOpenWrite) do
try
Size := 0;
Position := Size;
Write(Pointer(Data)^, Length(Data));
finally
Destroy;
end;
end;
...
...
...
procedure ReadEx(const FileName: string; var Data: string);
begin
with TFileStream.Create(FileName, fmOpenRead) do
try
Position := 0;
SetLength(Data, Size);
Read(Pointer(Data)^, Size);
finally
Destroy;
end;
end;
Кто-нибудь сталкивался с подобным "явлением"? Очень не хотелось бы писать черезTFileStream
, --- данных море :(
← →
Johnmen (2003-06-03 17:51) [1]Честно говоря, здесь все непонятно...
пишем в поток и тут же его разрушаем...?
вместо этой конструкции Pointer(tmpStr)^ - tmpStr[1]
с какого бока здесь Strm...?
Для примера,
чтение значения BLOB-а в поток :
TBlobField(FieldByName("value")).SaveToStream(MyMemoryStream);
или в строку :
s:=TBlobField(FieldByName("value")).Value;
ну а запись, ясен пень, LoadFromStream :)))
(можно и несколько по-другому, но суть та же)
← →
mrcat (2003-06-03 18:03) [2]Johnmen © (03.06.03 17:51)
>пишем в поток и тут же его разрушаем...?
Изначально я писал в Blob так:qreMarketsClasses.Value := SavePxToDB
, где qreMarketsClasses --- BLOB-поле, смотрел Borland"овский метод SetValue:
with DataSet.CreateBlobStream(Self, bmWrite) do
try
WriteBuffer(Pointer(Value)^, Length(Value));
finally
Free;
end;
Здесь поток уничтожается сразу после записи. И даже в этом случае данные пишутся не верно.
> с какого бока здесь Strm...?
сорри, конечно же StrmBlob, недопечатка :)
← →
mrcat (2003-06-03 19:28) [3]Кстати, если писать данные без использования
SavePxToDB
--- всё работает на ура!
SavePxToDB --- это [префикс размера данных] + [данные];
Неужели никто не сталкивался?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.036 c