Delphi-PRAXiS
Seite 6 von 8   « Erste     456 78      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Image in Access Datenbank speichern (https://www.delphipraxis.net/133254-image-access-datenbank-speichern.html)

DeddyH 1. Mai 2009 12:23

Re: Image in Access Datenbank speichern
 
Access ist meine schwache Stelle *g*, aber wenn ich das richtig verstehe, ist das schon der richtige Datentyp, hmm....

[edit] Hier noch 2 Links zum Nachlesen:
http://delphi.about.com/od/database/l/aa030601a.htm
http://entwickler-forum.de/showthread.php?t=18445 [/edit]

uwe12 1. Mai 2009 12:35

Re: Image in Access Datenbank speichern
 
das auslesen eines bildes aus der datenbank funktioniert, aber das speichern nicht.

DeddyH 1. Mai 2009 13:40

Re: Image in Access Datenbank speichern
 
Zeig doch nochmal den aktuellen Code zum Speichern.

uwe12 1. Mai 2009 17:49

Re: Image in Access Datenbank speichern
 
hier ist nochmal der code zum speichern. über einen anderen button legt ich über adodataset1.append einen neuen datensatz an.
Delphi-Quellcode:
var
  blob: TAdoBlobStream;
  fs:TMemorystream;
begin
AdoDataset1.edit;
  blob := TADOBlobStream.Create(AdoDataset1Bild, bmwrite);
    try
    fs := TMemorystream.create();
    ADOImage.Picture.Bitmap.SaveToStream(fs);
    fs.Seek(0, soFromBeginning);
    try
      blob.CopyFrom(fs, fs.Size);
    finally
      fs.Free;
    end;
  finally
    blob.Free;
          AdoDataset1.post;
  end;
end;

DeddyH 1. Mai 2009 18:15

Re: Image in Access Datenbank speichern
 
Und wenn Du das ADODataset.Edit weglässt?

[edit] Habe meinen alten Code wiedergefunden (Firebird und ZEOS, aber das dürfte mit ADO ähnlich funktionieren):
Delphi-Quellcode:
procedure TFrmNewPic.btnSaveClick(Sender: TObject);
var Stream: TMemoryStream;
    aBMP: TBitmap;
    aJPG: TJPEGImage;
begin
  if Image1.Picture.Graphic.Empty then exit;
  Stream := TMemoryStream.Create;
  try
    aBMP := TBitmap.Create;
    try
      aJPG := TJPEGImage.Create;
      try
        try
          aBMP.Assign(Image1.Picture.Graphic);
          aJPG.Assign(aBMP);
          aJPG.SaveToStream(Stream);
          Stream.Position := 0;
          with ZQuery1 do
            begin
              Close;            
              SQL.Text := 'INSERT INTO Bild(Grafik, Bezeichnung) VALUES(:img,:bez)';
              ParamByName('img').LoadFromStream(Stream,ftGraphic);
              ParamByName('bez').AsString := edtBezeichnung.Text;
              ExecSQL;
            end;
          MessageBox(Handle,'Bild wurde gespeichert','Information',MB_OK or MB_ICONINFORMATION);
          Close;
        except
          MessageBox(Handle,'Bild konnte nicht gespeichert werden','Fehler',MB_OK or MB_ICONERROR);
        end;
      finally
        aJPG.Free;
      end;
    finally
      aBMP.Free;
    end;
  finally
    Stream.Free;
  end;
end;

uwe12 1. Mai 2009 18:27

Re: Image in Access Datenbank speichern
 
dann kommt die fehlermeldung, dass das dataset nicht im editiermodus ist. aber was ich auch nicht verstehe, warum mein anderer buuton zum anlegen eines neuen datensatzes auch nicht funktioniert. hab nochmal den kompletten quelltext von dem programm reingestellt.

Delphi-Quellcode:
function JpegStartsInBlob(PicField:TBlobField):integer;
var
 bS    : TADOBlobStream;
 buffer : Word;
 hx    : string;
begin
 Result := -1;
 bS := TADOBlobStream.Create(PicField, bmRead);
 try
  while (Result = -1) and (bS.Position + 1 < bS.Size) do begin
   bS.ReadBuffer(buffer, 1);
   hx:=IntToHex(buffer,2);
   if hx = 'FF' then begin
     bS.ReadBuffer(buffer, 1);
     hx:=IntToHex(buffer,2);
     if hx = 'D8' then Result := bS.Position - 2
     else if hx = 'FF' then bS.Position := bS.Position-1;
   end;
  end;
 finally
  bS.Free
 end;
end;
procedure Tad.ADODataSet1AfterScroll(DataSet: TDataSet);
var
  bS : TADOBlobStream;
  Pic : TJpegImage;
 begin
  bS := TADOBlobStream.Create(AdoDataset1Bild, bmRead);
  try
    bS.Seek(JpegStartsInBlob(AdoDataset1Bild), soFromBeginning);
    Pic:=TJpegImage.Create;
    try
     Pic.LoadFromStream(bS);
     ADOImage.Picture.Graphic:=Pic;
    finally
     Pic.Free;
    end;
  finally
    bS.Free
  end;
end;

procedure Tad.Button1Click(Sender: TObject);
begin
if openpicturedialog1.Execute then
begin
  AdoImage.Picture.LoadFromFile(openpicturedialog1.FileName);
end;
end;
procedure Tad.Button2Click(Sender: TObject);
var
  blob: TAdoBlobStream;
  fs:TMemorystream;
begin
   AdoDataset1.edit;
  blob := TADOBlobStream.Create(AdoDataset1Bild, bmwrite);
    try
    fs := TMemorystream.create();
    ADOImage.Picture.Bitmap.SaveToStream(fs);
    fs.Seek(0, soFromBeginning);
    try
      blob.CopyFrom(fs, fs.Size);
    finally
      fs.Free;
    end;
  finally
    blob.Free;
          AdoDataset1.post;
  end;
end;
procedure Tad.Button3Click(Sender: TObject);
begin
adodataset1.append;
end;

procedure Tad.FormCreate(Sender: TObject);
var sDBPath, sCons: string;
begin
sDBPath := 'Desktop\Datenbank1.mdb';
sCons := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + sDBPath + ';Persist Security Info=False';
AdoDataset1.Active:=True;
end;
procedure Tad.FormDestroy(Sender: TObject);
begin
AdoDataset1.Active:=False;
end;
end.

DeddyH 2. Mai 2009 12:07

Re: Image in Access Datenbank speichern
 
Klappt es denn, wenn Du das mit SQL machst wie in meinem Beispiel?

uwe12 3. Mai 2009 08:21

Re: Image in Access Datenbank speichern
 
da kommt bei mir immer, dass ParamByName nicht deklariert wurde.

mkinzler 3. Mai 2009 08:42

Re: Image in Access Datenbank speichern
 
Bei Ado muss noch ein Parameters eingeschoben werden:
Dataset.Parameters.ParamByName().Value

uwe12 3. Mai 2009 08:49

Re: Image in Access Datenbank speichern
 
ich hab das jetzt mal davor geschrieben, aber es bleibt immer noch undeklariert.
Delphi-Quellcode:
AdoQuery1.Parameters.ParamByName().Value  
ParamByName('img').LoadFromStream(Stream,ftGraphic);
ParamByName('bez').AsString := edtBezeichnung.Text;


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:50 Uhr.
Seite 6 von 8   « Erste     456 78      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz