Hallo, hallo
Hmm, da wollte ich ein wenig Arbeit sparen und einen Teil einer größeren Datenstruktur als Record in einem BLOB-Feld ablegen und dann sowas. Aus mir nicht ersichtlichen Gründen weigert sich der Blobstream die Daten aufzunehmen.
Ich benutze Delphi 6E und Interbase 6 auf einem Windows 2000 System.
Die abzulegende Struktur sieht wie folgt aus :
<PRE>
TCSP_rPreis = RECORD
strPreisName : array [0..19] of Char;
wPreis : Integer;
bStandard : Boolean;
wSitzgruppenID : Integer;
wTastenCode : Integer;
end;
LP_TCSP_rPreis = ^TCSP_rPreis;
TPreisArray = array of TCSP_rPreis;
TStaticPreisArray = array [0..63] of TCSP_rPreis;
<B>m_arPreise : TStaticPreisArray;</B>
</PRE>
... und die Funktion zum Speichern so :
<PRE>
procedure TForm1.WriteToBLOB;
var
tsStream : TStream;
begin
IBDataSet1.Open;
IBDataSet1.Append;
tsStream := IBDataSet1.CreateBlobStream(IBDataSet1T_BLOB, bmWrite);
tsStream.Write(m_arPreise, sizeof(m_arPreise));
ShowMessage('Size : ' + IntToStr(tsStream.Size) + #13 + 'Position : ' + IntToStr(tsStream.Position));
IBDataSet1.Post;
end;
</PRE>
Die Message wird nur zu Kontrollzwecken ausgegeben, da ich ein seltsames Verhalten feststellen konnte. Sowohl <B>Size</B> als auch <B>Position</B> werden im Compiler unter den überwachten Ausdrücken nach der Write-Operation mit einem Wert von 0 angezeigt, aber von ShowMessage mit der korrekten Länge des Records ausgegeben.
Ich habe auch versucht, das ganze über eine IBQuery-Komponente zu lösen, war aber nur teilweise erfolgreich, da der nötige(?) PChar einen Integerwert von 0 in der Struktur natürlich als Schlußzeichen interpretierte.
Wie die Dinge liegen mache ich wohl etwas Grundlegendes falsch. Da ich vorher noch nicht mit BLOB-Feldern gearbeitet habe, ist mir jeder Tipp mehr als willkommen. Je ausführlicher desto besser 8).
Schon mal Danke und bis denn
Hmm, da wollte ich ein wenig Arbeit sparen und einen Teil einer größeren Datenstruktur als Record in einem BLOB-Feld ablegen und dann sowas. Aus mir nicht ersichtlichen Gründen weigert sich der Blobstream die Daten aufzunehmen.
Ich benutze Delphi 6E und Interbase 6 auf einem Windows 2000 System.
Die abzulegende Struktur sieht wie folgt aus :
<PRE>
TCSP_rPreis = RECORD
strPreisName : array [0..19] of Char;
wPreis : Integer;
bStandard : Boolean;
wSitzgruppenID : Integer;
wTastenCode : Integer;
end;
LP_TCSP_rPreis = ^TCSP_rPreis;
TPreisArray = array of TCSP_rPreis;
TStaticPreisArray = array [0..63] of TCSP_rPreis;
<B>m_arPreise : TStaticPreisArray;</B>
</PRE>
... und die Funktion zum Speichern so :
<PRE>
procedure TForm1.WriteToBLOB;
var
tsStream : TStream;
begin
IBDataSet1.Open;
IBDataSet1.Append;
tsStream := IBDataSet1.CreateBlobStream(IBDataSet1T_BLOB, bmWrite);
tsStream.Write(m_arPreise, sizeof(m_arPreise));
ShowMessage('Size : ' + IntToStr(tsStream.Size) + #13 + 'Position : ' + IntToStr(tsStream.Position));
IBDataSet1.Post;
end;
</PRE>
Die Message wird nur zu Kontrollzwecken ausgegeben, da ich ein seltsames Verhalten feststellen konnte. Sowohl <B>Size</B> als auch <B>Position</B> werden im Compiler unter den überwachten Ausdrücken nach der Write-Operation mit einem Wert von 0 angezeigt, aber von ShowMessage mit der korrekten Länge des Records ausgegeben.
Ich habe auch versucht, das ganze über eine IBQuery-Komponente zu lösen, war aber nur teilweise erfolgreich, da der nötige(?) PChar einen Integerwert von 0 in der Struktur natürlich als Schlußzeichen interpretierte.
Wie die Dinge liegen mache ich wohl etwas Grundlegendes falsch. Da ich vorher noch nicht mit BLOB-Feldern gearbeitet habe, ist mir jeder Tipp mehr als willkommen. Je ausführlicher desto besser 8).
Schon mal Danke und bis denn
Comment