![]() |
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).
|
Re: Image in Access Datenbank speichern
cool danke erstmal. :-D
|
Re: Image in Access Datenbank speichern
Schau doch inzwischen mal, ob das hier funktioniert:
![]() ![]() |
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] |
Re: Image in Access Datenbank speichern
aber bei mir wird kein bild gespeichert.
|
Re: Image in Access Datenbank speichern
Welches DBMS und welcher Datentyp ist das denn?
|
Re: Image in Access Datenbank speichern
Access (obwohl man sich da Streiten kann ob es ein richtiges "DBMS" ist)
|
Re: Image in Access Datenbank speichern
access und jpeg
|
Re: Image in Access Datenbank speichern
Und welchen Feldtyp hast Du da genommen?
|
Re: Image in Access Datenbank speichern
ole-object
|
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: ![]() ![]() |
Re: Image in Access Datenbank speichern
das auslesen eines bildes aus der datenbank funktioniert, aber das speichern nicht.
|
Re: Image in Access Datenbank speichern
Zeig doch nochmal den aktuellen Code zum Speichern.
|
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; |
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; |
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. |
Re: Image in Access Datenbank speichern
Klappt es denn, wenn Du das mit SQL machst wie in meinem Beispiel?
|
Re: Image in Access Datenbank speichern
da kommt bei mir immer, dass ParamByName nicht deklariert wurde.
|
Re: Image in Access Datenbank speichern
Bei Ado muss noch ein Parameters eingeschoben werden:
Dataset.Parameters.ParamByName().Value |
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; |
Re: Image in Access Datenbank speichern
Hallo,
Delphi-Quellcode:
Parameters wird "eingeschoben".
AdoQuery1.Parameters.ParamByName('img').Value:= LoadFromStream(Stream,ftGraphic);;
Heiko |
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; |
Re: Image in Access Datenbank speichern
Delphi-Quellcode:
AdoQuery1.Parameters.ParamByName('img').LoadFromStream(Stream,ftGraphic);
|
Re: Image in Access Datenbank speichern
und bei der zeile kommt aber auch noch undeklarierter bezeichner
Delphi-Quellcode:
ParamByName('bez').AsString := edtBezeichnung.Text;
|
Re: Image in Access Datenbank speichern
Delphi-Quellcode:
Parameters.ParamByName('bez').AsString := edtBezeichnung.Text;
|
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;
|
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. |
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;
|
Re: Image in Access Datenbank speichern
Scheint ein TEdit zu sein.
|
Re: Image in Access Datenbank speichern
aber für was soll das editfeld sein?
|
Re: Image in Access Datenbank speichern
Da kann man wohl eine Bezeichnung für das gespeicherte Bild angeben.
|
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; |
Re: Image in Access Datenbank speichern
Hallo,
was glaubst Du was das hier macht?
Delphi-Quellcode:
Grüße
MessageBox(Handle,'Bild wurde gespeichert','Information',MB_OK or MB_ICONINFORMATION);
Close; Klaus |
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 :?.
|
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; |
Re: Image in Access Datenbank speichern
kann mir keiner helfen?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:43 Uhr. |
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