Autor Beitrag
borrou
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 13.01.03 17:27 
Hallo an allen:)

Wer kann mir einen Tip geben warum das Lesen des BLOB Feldes 'Bild' mit eine Zugriffsverletzung endet und zwar beim Ausführen der Methode
getBLOBData an der Stelle, wo InData erzeugt wird.

Hier die Code:

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
function TDBWerkzeug.getBLOBData(ACol:TIB_Column):TStream;
var
  OutData:TStream;
  InData:TBlobStream;
  ZStream:TCustomZLibStream;
  ZLibBuffer,
  ZLibBufferSize:LongInt;
  Count:Integer;
begin
  Result:=nil;
  InData:=TBlobStream.Create(TBlobField(ACol),bmRead);// hier die    Zugriffsverletzung
  //wurden Daten aus  dem Blob-Feld gelesen?
  if InData.Size=0 then
    begin
      InData.Free;
     // ShowMessage(cErrNullData);
      Exit;
    end;
  try
    // Exportdatei anlegen
    OutData:=TMemoryStream.Create;
    try
      //komprimierte Blob-Daten entkomprimieren
      ZStream:=TDecompressionStream.Create(InData);;
      try
        //in 4096-Byte Häppchen in die Datei schreiben
        While true do
          begin
            Count:=ZStream.Read(ZLibBuffer,ZLibBufferSize);
            if Count<>0 then
              OutData.WriteBuffer(ZLibBuffer,Count)
            else
              Break;
          end;
      finally
        //
      end;
    finally
      //Free--> Buffer wird geleert
      ZStream.Free;
    // Ergebnis zuweisen
    Result:=OutData;
    end;
  finally
  //
  end;
end;


squery ist eine IB_Componente, die zur Laufzeit erzeugt wird und mittels SQL.Text und Open die Ergebnismenge hält.
Grafik ist ein TPicture Objekt das der Grafik aus der Datenbank speichern
soll.

ausblenden Quelltext
1:
2:
3:
4:
if squery.FieldByName('BILD').BlobSize>0 then
  Grafik:=TPicture(getBLOBData(squery.FieldByName('BILD')))
else
  Grafik:=nil;


Wer kann mir weiterhelfen?
Danke!
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Di 14.01.03 09:21 
Hi
leider kenn ich weder die Komponenten die du verwendest, noch weis ich was TIB_Column ist. Was ich allerdings weiss ist, dass ich bei Zugriff auf Blobs auch schon in die Schreibtischplatte gebissen habe :mrgreen:

Versuch doch mal anstelle der Zeile mit dem BlobStream folgendes:
ausblenden Quelltext
1:
2:
  MemoryStream := TMemoryStream.Create;
  TBlobField(ACol).SaveToStream(MemoryStream);

Dürfte allerdings nur dann klappen, wenn TIB_Column irgendwie von TField abgeleitet wurde.

Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
borrou Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 14.01.03 10:00 
Titel: BLOB Felder
Hallo Lothar,

danke für dein Vorschlag.
TIB_Column ist eine IBObject Komponente, die beide VCL TField und
TParam kombiniert und zur Ein- und Ausgabe der Spalteninhalt einer
Tabelle dient.
So wie es aussieht habe ich ein Kompatibilitätsproblem an der Stelle

ausblenden Quelltext
1:
InData:=TBlobStream.Create(TBlobField(ACol),bmRead);					

( der Cast schlägt fehl)

da TIB_Column direkt vom TObject abgeleitet ist, ein TBlobField aber
erwartet wird ( hat TComponent als Oberklasse).

Grüsse,
Boris