Entwickler-Ecke

Datenbanken - JPEG in SQL-Datenbank speichern und wieder auslesen


MCXSC - Di 13.06.06 01:28
Titel: JPEG in SQL-Datenbank speichern und wieder auslesen
Hallo!

Ersteinmal: Ich verwende "Absolute Database" und greife auf de Datenbank mit SQL zu. Jetzt will ich ein JPEG-Bild in die Datenbank speichern.

Bei den Demos zu "ADB" habe ich folgendes gefunden (Demo-Titel: "BlobsinSQL"):


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure speichern;
var
MimeCoder: TStringFormat_MIME64;
S: TMemoryStream;
begin
//vorherige Eingabe der SQL-Befehle
MimeCoder := TStringFormat_MIME64.Create;
S := TMemoryStream.Create;
S.LoadFromFile(bildoeffnen.FileName);
try
sql.add('  MimeToBin('''+MimeCoder.StrTo(S.Memory, S.Size)+'''), ');
finally
MimeCoder.Free;
S.Free;
end;
//weitere Eingabe von SQL-Befehlen und Ausführung
end;


[habe ein wenig Code rausgenommen; habe nur den nötigen Code (der zum seichern des Bildes) stehen lassen]

Das Funktioniert auch prima, da Bild ist in der Datenbank - genau wie in der Demo.

Mein Problem:

Ich bekomme es nicht hin, dieses gespeicherte JPEG-Bild wieder in eine Datei/Stream umzuwandeln. In der genannten Demo wird es über die Kompo DBImage gemacht, ich will es aber über SQL machen.

Kann mir jemand helfen?

MCXSC


WASEO - Mi 21.06.06 10:14

Hi!

Den Code finde ich etwas umständlich: Erst wird das Bild in das MIME-Format umgewandelt, dann von MIME in Binär und dann gespeichert. Warum nicht einfach so:


Delphi-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:
uses JPEG;

procedure TForm1.SpeichereBild;
var
  ms: TMemoryStream;
begin
  if OpenPictureDialog1.Execute then
  begin
    ms := TMemoryStream.Create; 
    try
      ms.LoadFromFile(OpenPictureDialog1.FileName);
      with Query1 do
      begin
        with SQL do
        begin
           Clear;
           Add('Insert into TABLE1 (IMAGEFIELD1) values (:param0 )');
        end;
        ParamByName('param0').SetBlobData(ms.Memory, ms.Size);
        ExecSQL;
      end;
    finally
      ms.Free;
    end;
  end;
end;

procedure TForm1.LadeBild;
var
  ms: TMemoryStream;
begin
  ms := TMemoryStream.Create; 
  TBlobField(Query1.FieldByName('IMAGEFIELD1')).SaveToStream(ms);
  ms.Position := 0
  ms.SaveToFile('C:\Bild.jpg');  // Bild speichern
  Image1.Picture.LoadFromFile('C:\Bild.jpg');  // Bild zeigen
  ms.Free;
end;