QT-Kérdés Blob (firebird)

 ( kagy | 2005. május 19., csütörtök - 16:43 )

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Üdv!

QT-t felhasználva írtam egy programot ami egy Firebird adatbázisba dolgozik.
Minden jónak tűnt mindaddig amíg nem keztem el az adatbázisba BLOB mezőket beszúrni és vissza olvasni. Ugyanis az olvasásnál ha a BLOB mező mérte nagyobb mint 16510 byte akkor csak az elejét hajlandó vissza olvasni.

Van egy példa program is BLOB-ok kezelésére (qt-examples/sql/blob) és az a megdöbbentő hogy ez a program is rosszul kezeli valyon miért és hogyan tudok nagyobb adatokat adatbázisba rakni és azt olvasni?

pl. blob kis állományok esetén:
[code:1:58059d3a50]
./blob main.cpp
Data size: 3416

QSqlQuery:
BLOB id: 1
BLOB size: 3416

QSqlCursor:
BLOB id: 1
BLOB size: 3416
BLOB id: 2
BLOB size: 3416
Unable to drop table - exiting
[/code:1:58059d3a50]

És amikor "nagy" állományt szeretnék bele rakni majd ki venni:

[code:1:58059d3a50]
./blob 00090000.sfs
Data size: 89842

QSqlQuery:
BLOB id: 1
BLOB size: 16510

QSqlCursor:
BLOB id: 1
BLOB size: 16510
BLOB id: 2
BLOB size: 16510
Unable to drop table - exiting
[/code:1:58059d3a50]

Minden öttletet szívesen veszek!

Szia,

Én nem QT C++ hanem Kylix/Delphi alól kezelem a FireBird-ös BLOB mezőket. Képeket mentek bele. Itt stream osztályt kell használni az olvasáshoz íráshoz. Talán segít ötletnek a lenti kód!
[code:1:054595bd63]
procedure TTorzsElem.ReadImageFromField(ImageField:TBlobField;Image:TImage;TempPath:string);
var
bstream:TSQLBlobStream;
memoStream:TMemoryStream;
compStream:TMemoryStream;
begin
if ImageField.IsNull then begin
memoStream:=TMemoryStream.Create;
Image.AutoSize:=true;
Image.Picture.Bitmap.LoadFromStream(memoStream);
Image.AutoSize:=false;
exit;
end;

memoStream:=TMemoryStream.Create;
compStream:=TMemoryStream.Create;

try
// blob kiolvasása
bstream:=TSQLBlobStream.Create(ImageField,bmReadWrite);
bstream.ReadBlobData;
bstream.Position:=0;

try
compStream.LoadFromStream(bstream);
DecompressStream(compStream,memoStream);
bstream.Free;
except
on E:Exception do begin
HibaUzenet(E.Message);
compStream.Size:=0;
memoStream.Size:=0;
end;
end;

try
Image.AutoSize:=true;
compStream.Position:=0;
memoStream.Position:=0;
Image.Picture.Bitmap.FreePixmap;
Image.Picture.Bitmap.FreeImage;
Image.Picture.Bitmap.LoadFromStream(memoStream);
Image.AutoSize:=false;
except
on E:Exception do HibaUzenet(E.Message);
end;
finally
memoStream.Free;
compStream.Free;
end;
end;
[/code:1:054595bd63]