![]() |
MySQL Blob als longblob Bild speichern und auslesen
In einer Bilderdatenbank sollen Bilder als jpg gepeichert werden und wieder ausgelesen werden. Irgendwie habe ich das Gefühl, dass in der Datenbankspalte 'BlobBild' irgendetwas steht nur nicht das Bild.
[code=delphi]
Code:
gespeichert soll werden:
procedure TAnzeige.FileListBox1Click(Sender: TObject);
begin Datei:=FileListBox1.FileName; Image1.Picture.LoadFromFile(FileListBox1.FileName); //<-das soll, wenn ich weiss wie es geht auf die Zelle der DB zeigen LblAnz.Caption:='Bild: '; end; [code=delphi]
Code:
Bis her war ich der Meinung dass man in Blob-Felder binäre Daten schreiben und lesen kann, oder irre ich mich da?
procedure TAnzeige.BuHinzuClick(Sender: TObject);
var Bild : TGraphic; begin IDBild:=0; //HoleDatei; with Datamodule1.cds1 do begin last; IDBild:=FieldByname('ID').AsInteger; edit; append; FieldByName('ID').AsInteger:=IDBild+1; fieldbyName('Datei').AsString:=Datei; fieldbyname('BlobBild').AsVariant:=Bild; //<-das will er so nicht, asPicture oder so gibts nicht. Applyupdates(-1); Image1.Picture.LoadFromFile(Datamodule1.cds1.FieldByName('BlobBild').Value); LblAnz.Caption:='Bild: '+Datamodule1.cds1.FieldByName('Datei').AsString; end; end; Danke für Antworten. |
Re: MySQL Blob als longblob Bild speichern und auslesen
Du wirst einen kleinen Umweg über Streams gehen müssen. In den meisten Zugriffsbibliotheken gibt es einen TBLOBStream, schau doch mal, ob das bei Dir auch so ist.
|
Re: MySQL Blob als longblob Bild speichern und auslesen
Aha, über Stream?
Wie geht das? Also nur nochmal zur Erklärung: Ich will den Inhalt eines Blobfeldes in 'Bild' speichern. Später möchte ich 'Bild' wieder in das Blobfeld speichern. Hab noch nie was mit Stream gemacht. Ich suche mal in den Tutos, vielleicht finde ich ja was..... :wiejetzt: Danke erstmal. |
Re: MySQL Blob als longblob Bild speichern und auslesen
Das Stichwort wurde schon genannt:
![]() Dort gibt es für jeden Zugriffsweg (BDE/ADO/native/dbExpress) Beispielcode der Verwendung. |
Re: MySQL Blob als longblob Bild speichern und auslesen
Vielen Dank
Welches USES fehlt mir noch?
Delphi-Quellcode:
weil bei
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, jpeg, StdCtrls, ExtCtrls, DBCtrls, DB, Grids, DBGrids, ToolWin, ComCtrls, ExtDlgs, FileCtrl, Menus, Mask;
Delphi-Quellcode:
will er TBlobstream nicht wissen. Ich arbeite mit den dbExpress-Geschichten...
procedure TAnzeige.BuHinzuClick(Sender: TObject);
var Bild : TGraphic; BS: TBlobStream; //<--Ärger begin |
Re: MySQL Blob als longblob Bild speichern und auslesen
Versuch es mit DBTables.
|
Re: MySQL Blob als longblob Bild speichern und auslesen
Danke DeddyH. das klappt soweit.
Nun bekomme ich immer, nachdem ich gesucht habe, immer den Fehler"Ungültige Typenumwandlung". Der Code sieht so aus:
Delphi-Quellcode:
procedure TAnzeige.BuHinzuClick(Sender: TObject);
var Bild : TPicture; BS: TBlobStream; jpg: TJPEGImage; begin IDBild:=0; //HoleDatei; try BS := TBlobstream.create(Datamodule1.cds1.FieldByName( 'BlobBild' )AS TBlobField, bmWrite ); //<-Genau immer Hier with Datamodule1.cds1 do begin last; IDBild:=FieldByname('ID').AsInteger; edit; append; FieldByName('ID').AsInteger:=IDBild+1; fieldbyName('Datei').AsString:=Datei; Applyupdates(-1); end; jpg := TJPEGImage.Create; jpg.LoadFromStream(bs); Image1.Picture.Assign(jpg); LblAnz.Caption:='Bild: '+Datamodule1.cds1.FieldByName('Datei').AsString; finally BS.free; end; end; |
Re: MySQL Blob als longblob Bild speichern und auslesen
Ich würde es mit der
![]() |
Re: MySQL Blob als longblob Bild speichern und auslesen
Hallo,
Bild in DB speichern geht so.
Delphi-Quellcode:
Das Feld tblImagepng32 ist vom Typ TBlobField
procedure TfrmAddImages.btnSaveImagesToDBClick(Sender: TObject);
var fstream: TMemoryStream; begin fstream := TMemoryStream.Create; tblImage.Append; fstream.LoadFromFile('C:\Test.png'); fstream.Position := 0; tblImagepng32.LoadFromStream(fstream); tblImage.Post; fstream.Free; end; // (Inhalte gekürzt, ich hoffe ich habe nicht zuviel gelöscht.) Der Ladevorgang ist ebenso einfach, du mußt es nur umstellen. Nie das fstream.Position := 0 vergessen, eine häufige Fehlerquelle. Damit wird nur die Position innerhalb des Stream zurückgesetzt, die nach dem Befehl fstream.LoadFromFile('C:\Test.png') auf der letzten steht. Denn bei tblImagepng32.LoadFromStream(fstream); willst du ja den gesamten Stream lesen. Ich hoffe ich konnte dir helfen. Gruß Matze |
Re: MySQL Blob als longblob Bild speichern und auslesen
Ok, Danke Bebe,
das funktioniert. Hab dann eine SQL-Datensicherung gemacht und mir angeguckt, was in dem BLOB steht, und es ist wirklich das Bild. Ach ja ich sollte noch erwähnen, dass in der Tabelle nur jpg vorkommen können. Nun habe ich angefangen das BlobFeld auszulesen und in ein TImage anzuzeigen. und da bekomme ich immer den Fehler JPEG #41. Dann habe ich hier gesucht und nix gefunden, nur das habe ich gefunden, was ich eh schon gemacht habe.
Delphi-Quellcode:
Das sind so die Ergebnisse die ich bei der Suche gefunden habe.
var sql : String;
BS : TClientBlobStream; blobF : TBlobField; MS : TMemorystream; jpg : TJPEGImage; ...//.. Schnipp //Bild anzeigen bS.Position:=(JpegStartsInBlob(Datamodule1.cds1.FieldByName('Blobbild') as TBlobField)); Try bS.Seek(JpegStartsInBlob(Datamodule1.cds1.FieldByName('Blobbild') as TBlobField), soFromBeginning); MS := TMemoryStream.Create; MS.CopyFrom(BS, BS.Size); MS.Position := BS.Position; jpg:=TJPEGImage.Create; //JPEGtoBMP(bs); jpg.LoadFromStream(bs); Image1.Picture.Graphic:=jpg; //habe das probiert Image1.Picture.Graphic.LoadFromStream(ms); //und das auch, und habe beides probiert. Finally ms.Free; End; Was mache ich hier falsch? |
Re: MySQL Blob als longblob Bild speichern und auslesen
Setz mal vor dem LoadFromStream dessen Position auf 0.
|
Re: MySQL Blob als longblob Bild speichern und auslesen
Was hältst du davon?
Delphi-Quellcode:
Zum anzeigen eines Bildes von einer Tabelle, verwende ich meistens einfach eine dbImage Komponente. Dort entfällt dann die Laderoutine, das macht dann die Komponente selbst. Versuche es mal damit.
procedure TfrmAddImages.btnLoadImagesFromDBClick(Sender: TObject);
var fstream: TMemoryStream; begin fstream := TMemoryStream.Create; tblImagepng32.SaveToStream(fstream); fstream.Position := 0; // Nicht vergessen ;-) Image1.Picture.Graphic.LoadFromStream(fstream); // das müsste reichen ... fstream.Free; end; Der Fehler JPEG#41 bedeutet nichts anderes, als das der stream leer ist. (Position auf 0 stellen vergessen, deswegen leer) Ausschnitt aus der jerror.h Datei aus der Source von der JPEG Komponente. Der 41. ENUM Wert. JMESSAGE(JERR_INPUT_EMPTY, "Empty input file") ![]() Gruß Matze [EDIT: Link hinzugefügt] |
Re: MySQL Blob als longblob Bild speichern und auslesen
Endlich, super nun funktioniert es..
Zitat:
Vielen Dank an alle... Nachdem ich gesehen habe, dass mit 75 Bildern die Dantenbank 150MB gross wirt, und das Öffnen meines Programmes ca 2 Minuten dauert, habe ich mich dazu entschlossen, nur die Verweise auf die Bilder in die Datenbank zu schreiben. Wenn die Bilder drin sind, dauert alles viel zu lange. Nochmals vielen Dank an alle, die mir geholfen haben. :bounce1: :bounce1: :bounce1: |
Re: MySQL Blob als longblob Bild speichern und auslesen
Das kommt aber auch auf die Struktur der DB und die Statements an. Wenn BLOBS enthalten sind, ist ein
SQL-Code:
natürlich tödlich.
SELECT * FROM Tabelle
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 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