Announcement

Collapse
No announcement yet.

BLOB - Felder und Records

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • BLOB - Felder und Records

    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

  • #2
    Hallo,

    in meinem Buch <i>InterBase Datenbankanwicklung mit Delphi</i> ist ein Beispielprojekt zu finden, aus dem der folgende Auszug stammt: <pre>
    procedure TForm1.InsertBMP(sFileName, sBMPName: String);
    var
    SR : TSaveRecord;
    FS : TFileStream;
    BS : TStream;
    begin
    IBDataSet1.Insert;
    IBDataSet1NAME.Value := sBMPName;
    SR := TSaveRecord.Create(nil);
    try
    SR.FFileName := sBMPName;
    FS := TFileStream.Create(sFileName, fmOpenRead);
    try
    SR.FFileData.CopyFrom(FS, FS.Size);
    SR.FFileSize := FS.Size;
    finally
    FS.Destroy;
    end;
    BS := IBDataSet1.CreateBlobStream(IBDataSet1DATA, bmWrite);
    try
    BS.WriteComponent(SR);
    IBDataSet1.Post;
    finally
    BS.Destroy;
    end;
    finally
    SR.Destroy;
    end;
    IBTransaction1.Commit;
    IBDataSet1.Open;
    end;
    </pre>
    Die Daten werden über <i>TSaveRecord = class(TComponent)</i> objektorientiert verpackt und über <b>WriteComponent</b> in das BLOb-Feld geschrieben

    Comment


    • #3
      Hi,

      Danke erstmal für die schnelle Antwort. Ich habe gerade ausprobiert, das Record in eine Komponente zu packen und es kam diesmal auch etwas in der Datenbank an. Leider war der MemoryStream, in dem das Record stecken sollte nach wie vor leer. Ich fürchte dieses Beispiel geht an dem Problem vorbei, welches darin besteht, die Daten in den Stream zu bekommen

      Comment


      • #4
        Hallo <br>
        <pre>
        procedure TForm1.WriteToBLOB;
        var
        tsStream : TStream;
        DebugINT : Longint;
        begin
        IBDataSet1.Open;
        IBDataSet1.Insert;
        tsStream := IBDataSet1.CreateBlobStream(IBDataSet1T_BLOB, bmWrite);
        // Vieleicht besser als tsStream.size zum Debug
        DebugINT:=tsStream.Write(m_arPreise, sizeof(m_arPreise));
        //tsStream.WriteBuffer(m_arPreise, sizeof(m_arPreise));
        IBDataSet1.Post;
        ShowMessage('Size : ' + IntToStr(DebugINT));
        end;
        </pre>
        Probier mal WriteBuffer als Alternative<br>Gruß Andreas H

        Comment

        Working...
        X