Autor Beitrag
mexx Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



BeitragVerfasst: Mo 29.01.07 16:20 
In Deinen Tut finde ich keine Zeile, in der das ersichtlich wird.

_________________
Das Unsympathische an den Computern ist, dass sie nur ja oder nein sagen können, aber nicht vielleicht.
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Mo 29.01.07 16:33 
user profile iconmexx hat folgendes geschrieben:
In Deinen Tut finde ich keine Zeile, in der das ersichtlich wird.

Dann schau Dir mal Zeile 5 im ersten Code an.
mexx Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



BeitragVerfasst: Mo 29.01.07 16:40 
Ja, Du setzt den Zeiger deiner Datenmenge auf einen bestimmten Datensatz. Jetzt im Nachgang wirds ersichtlich, aber ich wusste einfach nichts damit anzufangen. Ich bin einfach nicht auf die Idee gekommen, dass es wie eine Variable zu handhaben ist.

_________________
Das Unsympathische an den Computern ist, dass sie nur ja oder nein sagen können, aber nicht vielleicht.
mexx Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



BeitragVerfasst: Di 30.01.07 11:25 
Ich muss mal weiter fragen. Ich verwende zum Laden des Reports diesen Code und erhalte eine Zugriffsverletzung. Was mache ich falsch?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
         BlobStream := TMemoryStream.Create;
         BlobStream.Position := 0;
         BlobStream := TBlobStream(FieldByName('REPORT'));
         MainFstRpt.LoadFromStream(BlobStream);
         BlobStream.Free;

_________________
Das Unsympathische an den Computern ist, dass sie nur ja oder nein sagen können, aber nicht vielleicht.
mexx Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



BeitragVerfasst: Di 30.01.07 11:29 
Okay, ich habs gefunden.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
         BlobStream := TMemoryStream.Create;
         BlobStream.Position := 0;
         BlobStream := CreateBlobStream(FieldByName('REPORT'),bmReadWrite);
         MainFstRpt.LoadFromStream(BlobStream);
         BlobStream.Free;


Aber nun erhalte ich die Meldung, dass die Datenmenge nicht im Editiermodus sei, aber was spielt das für eine Rolle, wenn ich nur lesen will?

_________________
Das Unsympathische an den Computern ist, dass sie nur ja oder nein sagen können, aber nicht vielleicht.
mexx Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



BeitragVerfasst: Di 30.01.07 11:31 
Ich bin doch echt vom blöden und blinden Fisch bespuckt. Logo, wenn ich TBlobStreamMode auf bmReadWrite setzte und das auf der Datenmenge liegt, erhalte ich die Meldung. TBlobStreamMode auf bmRead gesetzt und schon geht es.

_________________
Das Unsympathische an den Computern ist, dass sie nur ja oder nein sagen können, aber nicht vielleicht.
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: Do 01.02.07 23:45 
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 :
ausblenden 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; // Stream erstellen
  BlobStream.Database := DB;  // Datenbank-Verbindung zuweisen
  BlobStream.Transaction := TA; // Transaktion zuweisen
  BlobStream.Mode := bmReadWrite; // Zugriffsart setzen
  BlobStream.BlobID := BlobID; // den Blob aus der DB lesen für update
  Stream.Position := StreamPos;
  BlobStream.LoadFromStream(Stream);
  Stream.Position := StreamPos;
  BlobStream.Finalize; // und in den Blob speichern
  BlobID := BlobStream.BlobID;
  BlobStream.Free;
end// WriteBlob


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

ausblenden 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; // Stream erstellen
  BlobStream.Database := DB;  // Datenbank-Verbindung zuweisen
  BlobStream.Transaction := TA; // Transaktion zuweisen
  BlobStream.Mode := bmRead; // wir wollen nur lesen
  BlobStream.BlobID := BlobID; // den Blob aus der DB lesen
  BlobStream.SaveToStream(Stream);
  Stream.Position := 0// an den Anfang des Streams zurückgehen
  If Stream.Size = 0 Then
    If bCanFreeStream Then
      FreeAndNil(Stream);
  BlobStream.Finalize; // und in den Blob speichern
  BlobStream.Free;
end// LoadBlob


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