Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ошиби данных при записи через TBlobStream [D6, MSSQL, Paradox]


mrcat ©   (2003-06-03 16:28:00) 

Добрый день!

В базе хранятся данные в 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, --- данных море :(


mrcat   (2003-06-03 19:28:00) [1]

Кстати, если писать данные без использования SavePxToDB--- всё работает на ура!

SavePxToDB --- это [префикс размера данных] + [данные];

Неужели никто не сталкивался?


mrcat   (2003-06-03 18:03:00) [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, недопечатка :)


Johnmen   (2003-06-03 17:51:00) [3]

Честно говоря, здесь все непонятно...
пишем в поток и тут же его разрушаем...?
вместо этой конструкции Pointer(tmpStr)^ - tmpStr[1]
с какого бока здесь Strm...?

Для примера,
чтение значения BLOB-а в поток :
TBlobField(FieldByName("value")).SaveToStream(MyMemoryStream);
или в строку :
s:=TBlobField(FieldByName("value")).Value;

ну а запись, ясен пень, LoadFromStream :)))
(можно и несколько по-другому, но суть та же)


Наверх

Титульная страница Поиск, карта сайта Написать письмо