Entwickler-Ecke
Datenbanken - Bilder in einer Datenbank speichern
Black_Fox - Mi 02.04.08 18:02
Titel: Bilder in einer Datenbank speichern
Hi ich würde gerne ein Bild was ich mit Hilfe eines Buttons in ein DBImage Feld lade, mit Hilfe eines weiteren Buttons in der Tabelle die ich angelegt habe speichern hier mein text bis her:
hab stelle wo der fehler komt mal kommentiert
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TFAdressbuch.BBildLadenClick(Sender: TObject); begin try if OpenPicture.Execute then DBBild.Picture.LoadFromFile(OpenPicture.FileName); except ShowMessage('Bild konnte nicht geöffnet werden!'); end; end;
procedure TFAdressbuch.BBildSpeichernClick(Sender: TObject); begin TAdressdaten.FieldValues['Bild'] := DBBild.Picture; -> hier kommt der Fehler "Inkompatible Typen Variant und TPicture" was kann ich dagegen machen? TAdressdaten.Post; TAdressdaten.Refresh; end; |
,
Moderiert von
Christian S.: Code- durch Delphi-Tags ersetzt
alzaimar - Mi 02.04.08 19:56
Du musst mit einem TBlobField (BLOB = Binary Large OBject) und einem Stream arbeiten. Das sollte so gehen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| Var MyPictureStream : TMemoryStream;
Begin MyPictureStream := TMemoryStream.Create; Try ThePicture.SaveToStream (MyPictureStream); MyPictureStream.Seek (0, soFromBeginning); (MyTable.FieldByName('PictureFieldName') as TBLobField).LoadFromStream (MyPictureStream); Finally MyPictureStream.Free; End End; |
Moderiert von
Christian S.: Delphi-Tags hinzugefügt
Black_Fox - Do 03.04.08 17:10
Habs jetzt so gemacht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TFAdressbuch.BBildSpeichernClick(Sender: TObject); var MyPictureStream : TMemoryStream; begin MyPictureStream := TMemoryStream.Create; Try ThePicture.SaveToStream (MyPictureStream); MyPictureStream.Seek (0, soFromBeginning); (TAdressdaten.FieldByName('Bild') as TBLobField).LoadFromStream (MyPictureStream); Finally MyPictureStream.Free; end end; |
bloß nur kommt eine Exception: "Im Project1.exe ist eine Exception aufgetreten der Klasse EDatabaseError. Meldung 'tAdressdaten: Datenmenge weder im Eitier- noch im Einfügemodus'. Prozeß wurde angehalten.Mit Einzelene...."
Moderiert von
Klabautermann: Code- durch Delphi-Tags ersetzt
alzaimar - Do 03.04.08 17:14
Na, in den Edit/Append-Modus solltest Du schon wechseln. Felder einer Datentabelle verändert man so:
Delphi-Quelltext
1: 2: 3:
| MyTable.Edit; MyTable['Feld'] := Irgendwas; MyTable.Post; |
Moderiert von
Klabautermann: Delphi-Tags eingefügt.
Blackheart666 - Do 03.04.08 17:17
Was für eine Delphiversion benutzt du denn, bei den Demos sollten einige Beispiele für Datenbanken bei sein jedenfalls bei der Prof und Enterprise.
Black_Fox - Do 03.04.08 18:58
ok werd ich mal ausprobieren^^ wusste das was fehlt
hab delphi 6 enterprise
Black_Fox - Fr 04.04.08 16:11
Hab das jetzt so gemacht, aber es kommt immer noch der Fehler:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TFAdressbuch.BBildSpeichernClick(Sender: TObject); var MyPictureStream : TMemoryStream; begin TAdressdaten.Edit; TAdressdaten['Bild'] := DBBild.Picture; MyPictureStream := TMemoryStream.Create;
Try ThePicture.SaveToStream (MyPictureStream); MyPictureStream.Seek (0, soFromBeginning); (TAdressdaten.FieldByName('Bild') as TBLobField).LoadFromStream (MyPictureStream); Finally MyPictureStream.Free; end; TAdressdaten.Post; end; |
Moderiert von
Klabautermann: Code- durch Delphi-Tags ersetzt
Sinspin - Fr 04.04.08 17:18
1. Wenn wir dir helfen sollen, solltest du uns den Text der Fehlermeldung nicht vorenthalten.
2. Verwende statt Code Tags, Delphi Tags um deinen Quelltext im Post einzubinden.
Black_Fox - Sa 05.04.08 13:58
zu 1. die fehlermedung hatte ich weiter oben schonmal erwähnt deswegen auch: "kommt immer noch der Fehler":
"Im Project1.exe ist eine Exception aufgetreten der Klasse EDatabaseError. Meldung 'tAdressdaten: Datenmenge weder im Eitier- noch im Einfügemodus'. Prozeß wurde angehalten.Mit Einzelene...."
zu 2. ok sind das delphi tags --> [delphi[[/delphi]?
IceBube - Sa 05.04.08 14:14
Wenn du ein Feld editieren willst, musst du es erst "auswählen"...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| TAdressdaten.RecNo := TAdressdaten.Edit; TAdressdaten['Bild'] := DBBild.Picture; MyPictureStream := TMemoryStream.Create; Try ThePicture.SaveToStream (MyPictureStream); MyPictureStream.Seek (0, soFromBeginning); (TAdressdaten.FieldByName('Bild') as TBLobField).LoadFromStream (MyPictureStream); Finally MyPictureStream.Free; end; TAdressdaten.Post; end; |
lg
Sinspin - Sa 05.04.08 17:40
Das man auf einem Datensatz stehen muss, ist sicherlich klar.
Was mich nur ein bisschen wundert ist die Zeile:
Delphi-Quelltext
1:
| TAdressdaten['Bild'] := DBBild.Picture; |
Mal abgesehen davon, das ich noch nie den Fall hatte das eine Zuweisung auf diese Art ohne Exception abgeht, ist das eigentlich gleichbedeutend mit:
Delphi-Quelltext
1:
| TAdressdaten.FieldByName('Bild') := DBBild.Picture; |
Diese Zeile dürfte also der Fehler sein.
Und dass, das Ergebnis:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TFAdressbuch.BBildSpeichernClick(Sender: TObject); var MyPictureStream : TMemoryStream; begin TAdressdaten.Edit; MyPictureStream := TMemoryStream.Create; Try ThePicture.SaveToStream (MyPictureStream); MyPictureStream.Seek (0, soFromBeginning); (TAdressdaten.FieldByName('Bild') as TBLobField).LoadFromStream (MyPictureStream); Finally MyPictureStream.Free; end; TAdressdaten.Post; end; |
Black_Fox - Sa 05.04.08 19:29
Kommt immer noch der Fehler T_T: hier nochmal der Quelltext für den Bild lade Button und den Bild speichern Button:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| procedure TFAdressbuch.BBildLadenClick(Sender: TObject); begin try if OpenPicture.Execute then DBBild.Picture.LoadFromFile(OpenPicture.FileName); except ShowMessage('Bild konnte nicht geöffnet werden!'); end; end;
procedure TFAdressbuch.BBildSpeichernClick(Sender: TObject); var MyPictureStream : TMemoryStream; begin TAdressdaten.Edit; MyPictureStream := TMemoryStream.Create; Try ThePicture.SaveToStream (MyPictureStream); MyPictureStream.Seek (0, soFromBeginning); (TAdressdaten.FieldByName('Bild') as TBLobField).LoadFromStream (MyPictureStream); Finally MyPictureStream.Free; end; TAdressdaten.Post; end; |
Also erst öffne ich ein Bild was ich auswähle in dem Fenster und dann soll es mit einem klick in der db gespeichert werden. Der Fehler kommt immer wenn ich das Programm gestartet habe und dann den Button Speichern drücke.
Black_Fox - Mi 09.04.08 09:03
hi kann mir jemand sagen was daran falsch ist? hab ne vermutung bin mir aber ni ganz sicher, weiß nämlich nicht wo das "ThePicture" zuzuordnen ist muss ich das deklarieren?
Sinspin - Mi 09.04.08 19:03
An dem Schnipsel ist nichts falsch.
Selbst wenn was mit ThePicture nicht stimmen würde, würdest du diese Fehlermeldung nicht bekommen. Da weder die Zuweisung noch TAdressdaten.Post bei einer Exception ausgeführt werden würde.
Aber, um auf Nummersicher zu gehen, kannst du es ja mal anders machen und es mit einer Datei von der Platte mal probieren und nicht aus einem Stream:
(TAdressdaten.FieldByName('Bild') as TBLobField).LoadFromFile(-filename-);.
Und dir dabei natürlich auch keinen Zugriff auf ThePicture gönnen, wenn du dort schon den Fehler vermutest.
Black_Fox - Do 10.04.08 17:32
also mit loadfromfile gehts, nur wie bekome ich das nun ohne hin?^^
kann ich das den irgendwie sagen das er das nicht aus einen file laden soll sondern aus einem image oder dbimage?
SmileySN - Do 10.04.08 23:29
Das "ThePicture" soll ein Synonym sein für das Bildobjekt, das auf Deinem Formular sitzt.
In Deinem Fall sollte das "DBBild" sein.
Black_Fox - Fr 11.04.08 08:54
aso ok hab ich mir schon gedacht aber da konnte ich glaube kein savetostream auswählen, da muss ich nochmal schauen
Black_Fox - Sa 12.04.08 13:33
jop hab nachgescaut kann da kein dbimage1.savetostream gibt es nicht? wie muss ich das jetzt machen?
SmileySN - Sa 12.04.08 15:10
Kein DBImage sondern ein einfaches Image nehmen und den Dateinamen mit Pfad aus der Datenbank lesen und dann im Image.loadfromfile laden.
Das Bild sollte als, für das Imageobjekt, lesbares Format vorliegen.
Das mit dem Stream ist doch noch etwas zu schwierig, mach es erst mal auf die einfache art.
Sinspin - Sa 12.04.08 19:20
Beim verwenden eines DBImages geht es eigentlich am einfachsten. Einfach die DataSource und das Feld zuweisen und erledigt.
Informationen dazu, wie man das Bild bearbeiten und ändern kann stehen in der Delphi Hilfe.
Black_Fox - Sa 12.04.08 19:45
also wasn nun dbimage oder image?
SmileySN - Sa 12.04.08 23:19
Beantworte Dir die Frage selbst durch:
Welche der beiden Varianten bekommst Du zum laufen ?
Lake - So 13.04.08 10:07
Also ich hatte das einmal so gelöst.
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| DatenMemStream.Clear; tblBlob.Edit; TJpegImage(image1.picture.Graphic).SaveToStream(DatenMemStream); DatenMemStream.Position := 0; TBlobField(tblBlob.FieldByName('Bild')).LoadFromStream(DatenMemStream); tblBlob.Post; |
Black_Fox - So 13.04.08 14:05
Naja bis jetzt hab ich das mit beiden noch nicht zum lauen bringen können werd das von lake nochmal ausprobieren und dann weiter schauen
MAlsleben - Mo 14.04.08 20:57
Hi,
wenn ich das richtig sehe, willst Du ein jpg als Bild in der Datenbank speichern. Das geht mit dbimage meines Erachtens nicht, denn das funktioniert in dem Fall nur mit bmp's.
Wie ein jpg in einer DB gespeichert und wieder angezeigt wird, wurde hier im Forum aber schon mehrmals gezeigt.
Einfach mal nach "jpg Datenbank" im Forum suchen.
Gruß Micha.
Black_Fox - Di 15.04.08 12:39
jo weiß ich aber die meisten sachen sind offen geblieben, außerdem möchte ich nun ja nur noch den pfad des bildes in der db speichern und wieder lesen und wenn ich dann nach jpg datenbank suche finde ich nichts wirklich dazu, kann auch sein das ich mich bissl blöd antelle^^
SmileySN - Di 15.04.08 13:28
Ich hab Dir das mit dem Bild in dem anderen Threat erklärt. (Daten aus Datenbank in Textdatei geordnet speichern)
Black_Fox - Di 15.04.08 17:30
jo danke
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!