Delphi-PRAXiS
Seite 2 von 2     12   

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 30. Apr 2009 15:22

Re: Image in Access Datenbank speichern
 
Nun weiß ich auch nicht mehr weiter. In einer guten Stunde bin ich zu Hause, dann schau ich nochmal in meinen Source (ist zwar kein ADO, aber das sollte keine große Rolle spielen).

uwe12 30. Apr 2009 15:27

Re: Image in Access Datenbank speichern
 
cool danke erstmal. :-D

DeddyH 30. Apr 2009 15:44

Re: Image in Access Datenbank speichern
 
Schau doch inzwischen mal, ob das hier funktioniert: http://www.shivi.de/eddb/index.php?a...297&artlang=de. Muss man das Post weglassen? Zumindest sehe ich da keinen entsprechenden Aufruf, obwohl mir das komisch vorkommt. Auf einer (türkischen?) Seite ist mir aufgefallen, dass der Stream vor dem Post freigegeben wird. Probier halt mal ein wenig.

DeddyH 30. Apr 2009 17:36

Re: Image in Access Datenbank speichern
 
Also, in dieser Reihenfolge funktioniert es bei mir:
- Append
- Blobstream erzeugen
- Blobstream füllen
- Blobstream freigeben
- Post

[edit] Wobei ich aber zugeben muss, dass ich die Daten nicht überprüft habe. [/edit]

uwe12 1. Mai 2009 12:11

Re: Image in Access Datenbank speichern
 
aber bei mir wird kein bild gespeichert.

DeddyH 1. Mai 2009 12:11

Re: Image in Access Datenbank speichern
 
Welches DBMS und welcher Datentyp ist das denn?

mkinzler 1. Mai 2009 12:13

Re: Image in Access Datenbank speichern
 
Access (obwohl man sich da Streiten kann ob es ein richtiges "DBMS" ist)

uwe12 1. Mai 2009 12:14

Re: Image in Access Datenbank speichern
 
access und jpeg

DeddyH 1. Mai 2009 12:17

Re: Image in Access Datenbank speichern
 
Und welchen Feldtyp hast Du da genommen?

uwe12 1. Mai 2009 12:19

Re: Image in Access Datenbank speichern
 
ole-object

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;

hoika 3. Mai 2009 08:51

Re: Image in Access Datenbank speichern
 
Hallo,

Delphi-Quellcode:
AdoQuery1.Parameters.ParamByName('img').Value:= LoadFromStream(Stream,ftGraphic);;
Parameters wird "eingeschoben".


Heiko

uwe12 3. Mai 2009 08:58

Re: Image in Access Datenbank speichern
 
aber loadfromstream belibt immer noch undeklariert. das kapier ich nicht. muss ich bei der anderen zeile auch noch so schreiben?
Delphi-Quellcode:
begin
SQL.Text := 'INSERT INTO Bild(Grafik, Bezeichnung) VALUES(:img,:bez)';
AdoQuery1.Parameters.ParamByName('img').value:=LoadFromStream(Stream,ftGraphic);
ParamByName('bez').AsString := edtBezeichnung.Text;
ExecSQL;
end;

mkinzler 3. Mai 2009 09:12

Re: Image in Access Datenbank speichern
 
Delphi-Quellcode:
AdoQuery1.Parameters.ParamByName('img').LoadFromStream(Stream,ftGraphic);

uwe12 3. Mai 2009 09:30

Re: Image in Access Datenbank speichern
 
und bei der zeile kommt aber auch noch undeklarierter bezeichner
Delphi-Quellcode:
ParamByName('bez').AsString := edtBezeichnung.Text;

mkinzler 3. Mai 2009 09:35

Re: Image in Access Datenbank speichern
 
Delphi-Quellcode:
Parameters.ParamByName('bez').AsString := edtBezeichnung.Text;

uwe12 3. Mai 2009 09:38

Re: Image in Access Datenbank speichern
 
aber irgendwie bleibz immernoch asString nicht deklariert und bei edtBezeichnung weis ich nicht genau was damit gemeint ist.
Delphi-Quellcode:
Parameters.ParamByName('bez').AsString := edtBezeichnung.Text;

mkinzler 3. Mai 2009 09:42

Re: Image in Access Datenbank speichern
 
Dann versuch es mit .Value statt .asString.
Du solltest aber versuchen den Code zu verstehen und nicht nur abzupinseln.

uwe12 3. Mai 2009 09:46

Re: Image in Access Datenbank speichern
 
value funktioniert, aber mit edtBezeichnung weis ich nicht was damit gemeint ist, bzw. weis ich nicht, wie ich es deklarieren soll.
Delphi-Quellcode:
Parameters.ParamByName('bez').value := edtBezeichnung.Text;

mkinzler 3. Mai 2009 09:48

Re: Image in Access Datenbank speichern
 
Scheint ein TEdit zu sein.

uwe12 3. Mai 2009 09:50

Re: Image in Access Datenbank speichern
 
aber für was soll das editfeld sein?

mkinzler 3. Mai 2009 09:51

Re: Image in Access Datenbank speichern
 
Da kann man wohl eine Bezeichnung für das gespeicherte Bild angeben.

uwe12 3. Mai 2009 09:57

Re: Image in Access Datenbank speichern
 
das speichern funktioniert jetzt. aber wenn ich das bild speichere, dann kommt die meldung, dass das bild gespeichert wurde. wenn ich dann auf ok klicke, dann schließt sich das programm.ich habe den quelltext mal so umgeschrieben:
Delphi-Quellcode:
procedure Tad.Button2Click(Sender: TObject);
var Stream: TMemoryStream;
    aBMP: TBitmap;
    aJPG: TJPEGImage;
begin
  if AdoImage.Picture.Graphic.Empty then exit;
  Stream := TMemoryStream.Create;
  try
    aBMP := TBitmap.Create;
    try
      aJPG := TJPEGImage.Create;
      try
        try
          aBMP.Assign(AdoImage.Picture.Graphic);
          aJPG.Assign(aBMP);
          aJPG.SaveToStream(Stream);
          Stream.Position := 0;
          with Adoquery1 do
            begin
              Close;
              SQL.Text := 'INSERT INTO Tabelle1(Bild) VALUES(:img)';
               AdoQuery1.Parameters.ParamByName('img').LoadFromStream(Stream,ftGraphic);

              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;

Klaus01 3. Mai 2009 09:59

Re: Image in Access Datenbank speichern
 
Hallo,

was glaubst Du was das hier macht?

Delphi-Quellcode:
 MessageBox(Handle,'Bild wurde gespeichert','Information',MB_OK or MB_ICONINFORMATION);
 Close;
Grüße
Klaus

DeddyH 3. Mai 2009 12:16

Re: Image in Access Datenbank speichern
 
Entschuldige, dass ich hier unmodifizierten Code aus einem meiner Programme eingestellt habe, den Du so nicht 1:1 übernehmen kannst. Ein klein wenig Eigeninitiative hatte ich schon erwartet :?.

uwe12 3. Mai 2009 18:05

Re: Image in Access Datenbank speichern
 
tut mir leid, ich habe das close nicht gesehen. das speichern funktioniert schon soweit, aber nach dem speichern sind aber keine datensätze in der dbgrid vorhanden. wenn ich das programm neustarte, dann kommen zwar die datensätze wieder, aber die bilder werden nicht angezeigt. ein neuer datensatz wird über einen anderen button hinzugefügt.
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;//if
  end;//while
 finally
  bS.Free
 end; //try
end;

procedure Tad.ADODataSet1AfterScroll(DataSet: TDataSet);
var
  bS : TADOBlobStream;
  Pic : TJpegImage;
 begin
  bS := TADOBlobStream.Create(AdoQuery1Bild, bmRead);
  try
    bS.Seek(JpegStartsInBlob(AdoQuery1Bild), 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 Stream: TMemoryStream;
    aBMP: TBitmap;
    aJPG: TJPEGImage;
begin
  if AdoImage.Picture.Graphic.Empty then exit;
  Stream := TMemoryStream.Create;
  try
    aBMP := TBitmap.Create;
    try
      aJPG := TJPEGImage.Create;
      try
        try
          aBMP.Assign(AdoImage.Picture.Graphic);
          aJPG.Assign(aBMP);
          aJPG.SaveToStream(Stream);
          Stream.Position := 0;
          with Adoquery1 do
            begin
              Close;
              SQL.Text := 'INSERT INTO Tabelle1(Bild) VALUES(:img)';
               AdoQuery1.Parameters.ParamByName('img').LoadFromStream(Stream,ftGraphic);
               ExecSQL;
            end;
          MessageBox(Handle,'Bild wurde gespeichert','Information',MB_OK or MB_ICONINFORMATION);
                  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;
procedure Tad.Button3Click(Sender: TObject);
begin
adoquery1.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';
AdoQuery1.Active:=True;
end;
procedure Tad.FormDestroy(Sender: TObject);
begin
AdoQuery1.Active:=False;
end;

uwe12 5. Mai 2009 18:44

Re: Image in Access Datenbank speichern
 
kann mir keiner helfen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:47 Uhr.
Seite 2 von 2     12   

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