![]() |
Datenbank: Access • Zugriff über: AdoTable
Image in Access Datenbank speichern
Hallo, ich möchte ein Jpeg-Bild in einer Access-Datenbank speichern. Wie ich es aus einer Datenbank auslesen kann, habe ich bereits herausgefunden, aber wie ich es in einer Datenbank speichere hab ich leider noch nicht herausgefunden.
|
Re: Image in Access Datenbank speichern
Access ist überhaupt nicht mein Gebiet, aber ginge das nicht über einen Blobstream?
|
Re: Image in Access Datenbank speichern
Wie liest du es aus?
|
Re: Image in Access Datenbank speichern
mit einem AdoTable über Blobstream
|
Re: Image in Access Datenbank speichern
Dann schau dir doch mal die Methoden von TStream an :zwinker:
|
Re: Image in Access Datenbank speichern
Ich habe keine Ahnung, wie ich das mit dem Speichern umsetzen könnte. Aber ich vermutet, dass das ungefähr genauso funktionieren müsste, wie das Laden aus einer Datenbank. z.B. mit SaveToStream oder soetwas?
|
Re: Image in Access Datenbank speichern
Ich habe mal vor Jahren sowas gemacht und kann mich nur daran erinnern das, obwohl jpgs verwendet wurden, die Datenbank sich mächtig aufgebläht hat. Ich habe stattdessen die Bilder in einem Verzeichnis gespeichert und lediglich die Pfade in der DB abgelegt.
Siehe auch: ![]() HeinzJ |
Re: Image in Access Datenbank speichern
Ich möchte das Bild aber trotzdem lieber direkt in der Datenbank speichern.
|
Re: Image in Access Datenbank speichern
Schau mal hier:
![]() |
Re: Image in Access Datenbank speichern
Ich hab das mal ausprobiert, aber irgendwie funktioniert das bei mir nicht richtig. Ist das eigentlich nur für Bitmap oder auch für Jpeg. Hab das mal so versucht:
Delphi-Quellcode:
var
BlobField: TField; BS: TStream; begin with AdoTable1 do begin Insert; BlobField := FieldByName('Bild'); BS := CreateBlobStream(BlobField,bmWrite); AdoImage.Picture.Bitmap.SavetoStream(BS); AdoTable1.Post; end; |
Re: Image in Access Datenbank speichern
BLOB ist BLOB, ob Bitmap, JPEG oder Word-Dokumente, völlig egal. Und was heißt "funktioniert nicht richtig" denn genau? Ich muss allerdings dazu sagen, dass ich eigentlich nie was mit ADO mache.
|
Re: Image in Access Datenbank speichern
Es kommt immer die Fehlermeldung ,,Stream-Lesefehler".
|
Re: Image in Access Datenbank speichern
Dann versuch es mal hiermit:
![]() |
Re: Image in Access Datenbank speichern
Ich habe das Beispiel mal ausprobiert, aber irgendwie bekomme ich es nicht hin. Bekomme folgende Fehlermeldung: Es gibt keine überladene Version von 'Create', die man mit diesen Argumenten aufrufen kann
Delphi-Quellcode:
var
blob: TAdoBlobStream; fs:TFilestream; begin blob := TADOBlobStream.Create(AdoTable1Bild, bmwrite); try blob.Seek(0, soFromBeginning); fs := TFileStream.Create(AdoTable1Bild, fmOpenRead or fmShareDenyWrite); try blob.CopyFrom(fs, fs.Size) finally fs.Free end; finally blob.Free end; |
Re: Image in Access Datenbank speichern
Das liegt daran, dass Du ja keine Datei von der Festplatte lädst, sondern ein Bild aus einem Image haben möchtest. Du musst also den FileStream in einen MemoryStream ändern und das Bild dort hineinladen. Der Rest mit CopyFrom usw. bleibt dann aber gleich.
|
Re: Image in Access Datenbank speichern
Ich habe das jetzt mal geändert aber es kommt immer noch der gleiche Fehler.
Delphi-Quellcode:
var
blob: TAdoBlobStream; fs:TMemorystream; begin AdoTable1.edit; blob := TADOBlobStream.Create(AdoTable1Bild, bmwrite); try blob.Seek(0, soFromBeginning); fs := TMemorystream.create(); try blob.CopyFrom(fs, fs.Size) finally fs.Free end; finally blob.Free end; AdoTable1.post; end; |
Re: Image in Access Datenbank speichern
Kann das sein, dass Du die Streams verwechselt hast? Mal aus dem Kopf (daher keine Garantie):
Delphi-Quellcode:
var
blob: TAdoBlobStream; fs:TMemorystream; begin AdoTable1.edit; blob := TADOBlobStream.Create(AdoTable1Bild, bmwrite); try fs := TMemorystream.create(); ADOImage.Picture.Bitmap.SaveToStream(fs); fs.Seek(0, soFromBeginning); try blob.CopyFrom(fs, fs.Size); AdoTable1.post; finally fs.Free; end; finally blob.Free; end; end; |
Re: Image in Access Datenbank speichern
irgendwie kommt der fehler immernoch. ich habe keine ahnung, an was das liegen könnte.
|
Re: Image in Access Datenbank speichern
In welcher Zeile kommt der Fehler denn?
|
Re: Image in Access Datenbank speichern
jetzt kommt bei mir die Meldung ,,Stream read error". aber ich glaub das liegt jetzt nciht mehr am speichern, sondern an der procedure für das auslesen des bildes.
|
Re: Image in Access Datenbank speichern
Nun sag doch mal, wo genau. Der Fehler muss ja erst einmal eingegrenzt werden.
|
Re: Image in Access Datenbank speichern
ich hab den fehler gefunden, es lag garnicht an dem speichern, sondern wo anderes im programm. Aber wenn ich jetzt auf speichern klicke, kommt die Fehlermeldung ,,AdoTable1:Dataset not in edit or insert mode"
|
Re: Image in Access Datenbank speichern
dann schreib doch davor mal AdoTable1.Edit oder so, wenn die Fehlermeldung kommt...
|
Re: Image in Access Datenbank speichern
In Zeile 5 steht doch explizit "ADOTable1.Edit;" :gruebel:
|
Re: Image in Access Datenbank speichern
Hallo,
zeig noch mal den Code. Du hast vielleicht beim Rumprobieren was geändert ? Und markier die gleich noch Zeile (<<--), wo der Fehler kommt. Heiko |
Re: Image in Access Datenbank speichern
wenn ich einen neuen datensatz anlegen möchte und dann auf speichern klicke, dann kommt immer folgender Fehler: AdoTable1:Datenmenge werder im Editier- noch im Einfügemodus aufgetreten.
Delphi-Quellcode:
der Fehler kommt bei AdoTable1.post;
var
blob: TAdoBlobStream; fs:TMemorystream; begin AdoTable1.edit; blob := TADOBlobStream.Create(AdoTable1Bild, bmwrite); try fs := TMemorystream.create(); ADOImage.Picture.Bitmap.SaveToStream(fs); fs.Seek(0, soFromBeginning); try blob.CopyFrom(fs, fs.Size); AdoTable1.post; finally fs.Free; end; finally blob.Free; end; end; |
Re: Image in Access Datenbank speichern
Da bin ich momentan überfragt. Ich kann aber gerne heute Abend zu Hause mal nachsehen, wie ich das gemacht habe.
|
Re: Image in Access Datenbank speichern
ok, danke erstmal
|
Re: Image in Access Datenbank speichern
Hallo,
mache mal einen Watch-Point auf AdoTablel.State (Ctrl+F7). Dann Breakpoint auf AdoTablel.Edit. Danach sollte State dsEdit sein. Dann Schrittweise bis zum Post. Ändert sich der Status irgendwo ? Heiko |
Re: Image in Access Datenbank speichern
Das ist nie dsEdit sondern immer dsInsert...
|
Re: Image in Access Datenbank speichern
Hallo,
entweder die Tabelle ist leer oder du stehst hinter dem letzten Datensatz (EOF), dann wird ein Table.Edit automatisch zu Table.Insert, oder du machst was verkehrt ... Was machst du genau vor dem Table.Edit ? Hängt an dem Table noch was dran (DBGrid) ? #Edit: gerade gesehen Zitat:
Lass mal den ganzen Blob-Kram weg und lege nur einen leeren Record an. Heiko |
Re: Image in Access Datenbank speichern
ich versteht das nicht ganz. ich komm irgendwie nicht weiter. die tabelle ist nicht leer. Vor dem AdoTable1.edit lege ich einen neuen datensatz über Adotable1.append an.
hab hier nochmal mein quelltext.
Delphi-Quellcode:
var
blob: TAdoBlobStream; fs:TMemorystream; begin AdoTable1.edit; blob := TADOBlobStream.Create(AdoTable1Bild, bmwrite); try fs := TMemorystream.create(); ADOImage.Picture.Bitmap.SaveToStream(fs); fs.Seek(0, soFromBeginning); try blob.CopyFrom(fs, fs.Size); AdoTable1.post; finally fs.Free; end; finally blob.Free; end; end; |
Re: Image in Access Datenbank speichern
Kommt denn nach dem Append noch ein Post?
|
Re: Image in Access Datenbank speichern
Hallo,
Zitat:
Ich sehe hier kein Append. Ein Edit ist nicht nowendig, wenn du genau vorher ein Append machst. Unter Tex würde man jetzt sagen: Minimal-Bsp. erzeugen und + DB posten. Heiko |
Re: Image in Access Datenbank speichern
es kommt nur append. ich habe hier mal meinen gesamten quelltext.
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 TForm1.ADOTable1AfterScroll(DataSet: TDataSet); var bS : TADOBlobStream; Pic : TJpegImage; begin if AdoTable1.FieldByName('Bild').AsString <> '' then begin bS := TADOBlobStream.Create(AdoTable1Bild, bmRead); try bS.Seek(JpegStartsInBlob(AdoTable1Bild), soFromBeginning); Pic:=TJpegImage.Create; try Pic.LoadFromStream(bS); ADOImage.Picture.Graphic:=Pic; finally Pic.Free; end; finally bS.Free end; end; end; procedure TForm1.Button1Click(Sender: TObject); begin if openpicturedialog1.Execute then begin AdoImage.Picture.LoadFromFile(openpicturedialog1.FileName); end; end; procedure TForm1.Button2Click(Sender: TObject); var blob: TAdoBlobStream; fs:TMemorystream; begin AdoTable1.edit; blob := TADOBlobStream.Create(AdoTable1Bild, bmwrite); try fs := TMemorystream.create(); ADOImage.Picture.Bitmap.SaveToStream(fs); fs.Seek(0, soFromBeginning); try blob.CopyFrom(fs, fs.Size); finally AdoTable1.post; fs.Free; end; finally blob.Free; end; end; procedure TForm1.Button3Click(Sender: TObject); begin Adotable1.Append; end; procedure TForm1.FormCreate(Sender: TObject); var sDBPath, sCons: string; begin sDBPath := 'O:\adopic\Datenbank1.mdb'; sCons := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + sDBPath + ';Persist Security Info=False'; ADOTable1.Active:=True; end; procedure TForm1.FormDestroy(Sender: TObject); begin ADOTable1.Active:=False; end; end. |
Re: Image in Access Datenbank speichern
Also entweder Append oder Edit, so wie oben macht das ja nicht viel Sinn.
|
Re: Image in Access Datenbank speichern
aber wenn ich das Adotable1.edit weglasse, dann kommt folgende Fehlermeldung, wenn ich auf speichern klicke: Eine leere Zeile kann nicht eingefügt werden. Mindestens ein Spaltenwert der Zeile muss festgelegt sein.
|
Re: Image in Access Datenbank speichern
Nimm doch das jetzige Append weg und mach es dorthin, wo jetzt Edit steht (ich mache sowas immer per SQL und nicht per Dataset-Methoden, daher bin ich da nicht ganz sicher).
|
Re: Image in Access Datenbank speichern
Zitat:
|
Re: Image in Access Datenbank speichern
es kommt immernoch die meldung: eine leere zeile kann nicht eingefügt werden. Ich glaube das programm weis nicht, was es einfügen soll.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:24 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