![]() |
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:50 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