ok, da sich keiner direkt dazu geäussert hat und ich leider auch nun nicht sehe, ob das Problem schon gelöst ist oder nur teilweise, schreib ich einfach mal was dazu...
ich weiss nicht, inwieweit du verstanden hast, wie Firebird/Interbase Blobs verwaltet, deswegen fang ich da mal kurz an.. dann wird das ganze nachher nämlich auch logisch.
Einfach ausgedrückt gibt es einen Bereich in der DB, wo die ganzen blobs gespeichert werden (da sie nicht in der Tabelle selbst gespeichert werden können). Jeder Blob erhált dazu einen Descriptor, die BlobID. Die erhälst Du beim Schreiben des Blobs bzw. wenn Du eine Abfrage auf eine Tabelle mit blob machst, kriegst Du ja eigentlich nicht den Blob, sondern erstmal nur die BlobID. Mit dieser kannst Du dir dann den blob abholen. Die meisten wissen es sicherlich nicht, da das ja die Komponenten für sie alles erledigen
Zur Vorgehensweise beim Speichern eines Blobs : Erstmal packst Du alles in einen BlobStream, hier ein Beispiel aus meinem CodeBase, der seit Jahren so läuft und funktioniert :
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure WriteBlob(var BlobID: TISC_QUAD; Stream: TMemoryStream; DB: TFIBDatabase; TA: TFIBTransaction; StreamPos: Integer = 0); var BlobStream : TFIBBlobStream; begin If not Assigned(Stream) Then Exit;
BlobStream := TFIBBlobStream.Create; BlobStream.Database := DB; BlobStream.Transaction := TA; BlobStream.Mode := bmReadWrite; BlobStream.BlobID := BlobID; Stream.Position := StreamPos; BlobStream.LoadFromStream(Stream); Stream.Position := StreamPos; BlobStream.Finalize; BlobID := BlobStream.BlobID; BlobStream.Free; end; |
Dies ist natürlich eine Generelle Schreibmethode, kann also neue Blobs anlegen sowie vorhandene updaten. In Zeile 10 setze ich die BlobID dazu vor dem Schreiben, dadurch wird ein vorhandener Blob ersetzt, sofern es eine gültige BlobID ist. Du erhälst die BlobID deines Datensatzes bei der Abfrage, steckst sie zusammen mit den anderen Infos in diese Funktion und danach schreibst du die erhaltene BlobID wieder in die Datenbank mithilfe eines updates.
Schaust Du dir die BlobID vor dem Schreiben des Blobs und danach mal im Debugger an, wirst Du sehen, dass sie recht unterscheidlich aussehen. Das liegt daran, dass der geschriebene Blob erstmal nur vorläufig drin ist, da Du die BlobID noch nicht gespeichert hast und somit der Blob noch nicht vollständig ist.
und hier noch eben das Lesen des Blobs
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure LoadBlob(BlobID: TISC_QUAD; var Stream: TMemoryStream; DB: TFIBDatabase; TA: TFIBTransaction; bCanFreeStream: Boolean = True); var BlobStream : TFIBBlobStream; begin If not Assigned(Stream) Then Stream := TMemoryStream.Create; BlobStream := TFIBBlobStream.Create; BlobStream.Database := DB; BlobStream.Transaction := TA; BlobStream.Mode := bmRead; BlobStream.BlobID := BlobID; BlobStream.SaveToStream(Stream); Stream.Position := 0; If Stream.Size = 0 Then If bCanFreeStream Then FreeAndNil(Stream); BlobStream.Finalize; BlobStream.Free; end; |
So, hoffe das hilft Dir ein bissl, die Blobgeschichte zu verstehen. Wenn Du noch weitere Fragen hast...
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw