AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Bild in Datenbank speichern - Problem
Thema durchsuchen
Ansicht
Themen-Optionen

Bild in Datenbank speichern - Problem

Ein Thema von Root2k · begonnen am 17. Apr 2012 · letzter Beitrag vom 17. Apr 2012
Antwort Antwort
Root2k

Registriert seit: 7. Jun 2011
Ort: Ulm
49 Beiträge
 
Delphi XE Enterprise
 
#1

Bild in Datenbank speichern - Problem

  Alt 17. Apr 2012, 08:41
Datenbank: MySQL • Version: 5.0.27 • Zugriff über: DevartDBExpress
Hi,

erstmal die Daten vorweg:

Datenbank: MySQL
Version: 5.0.27
BLOB-Feld: MEDIUMBLOB

Noch eine kleine Info: Ich habe viele Foren durchstöbert und unterschiedliche Wege ausprobiert. Allerdings schaffe ich es nicht, ein Bild in dem BLOB-Feld zu speichern... und genau das ist jetzt mein Problem.

Folgender Code für das Anzeigen von Bildern funktioniert wunderbar (stammt aber von einem Kollegen)...

Delphi-Quellcode:
function TDatabaseConnection.GetImage(query, AField: String;
  var Image: TJpegImage): boolean;
var
  s: TMemoryStream;
begin;
  OpenQuery(query); // query := 'SELECT bild FROM foto WHERE id = 123'
  s := TMemoryStream.Create;
  try
    try
      TBlobField(SQLQuery.FieldByName(AField)).SaveToStream(s); // SQLQuery ist vom Typ TSQLQuery
      s.Position := 0;
      if s.Size > 0 then
      begin
        Image.LoadFromStream(s);
      end;
    except
      on E: Exception do
        ShowMessage('Fehler');
    end;
  finally
    begin
      s.Free;
      FreeAndNil(SQLQuery);
    end;
  end;
end;

Der folgende Code funktioniert nicht! Ich habe selber mal ein bisschen rumprobiert, habe aber ehrlich gesagt auch keine Ahnung wie das wirklich funktioniert oder funktionieren sollte. Forenbeiträge hab ich aber massig gelesen und viel ausprobiert... leider erfolglos.

Speichern von Bildern:
Delphi-Quellcode:
function TDatabaseConnection.SetImage(query, AField: String;): boolean;
var
  s: TMemoryStream;
begin;
  s := TMemoryStream.Create;
  try
    try
      s.LoadFromFile('*BILDPFAD*\*BILDNAME*.jpg');
      s.Position := 0;
      if s.Size > 0 then
      begin
        SQLQuery.Append;
        // Auch mit SQLQuery.Edit noch getestet
        TBlobField(SQLQuery.FieldByName(AField)).LoadFromStream(s);
        SQLQuery.Post;
      end;
    except
      on E: Exception do
        ShowMessage('Fehler');
    end;
  finally
    begin
      s.Free;
      FreeAndNil(SQLQuery);
    end;
  end;
end;
Könnt Ihr mir vielleicht sagen wie ich das umschreiben muss, damit der Code funktioniert? Ich steh momentan absolut auf dem Schlauch und weiß nicht weiter.

Bin für jeden sinnvollen Beitrag dankbar!

Geändert von Root2k (17. Apr 2012 um 09:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#2

AW: Bild in Datenbank speichern - Problem

  Alt 17. Apr 2012, 08:55
Ehrlich gesagt verstehe ich den Code auch nicht: von welchem Typ ist SQLQuery und wo kommt das überhaupt her? Wozu 3 Parameter, wenn davon nur einer genutzt wird? Wieso eine Funktion, die immer false zurückgibt?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Root2k

Registriert seit: 7. Jun 2011
Ort: Ulm
49 Beiträge
 
Delphi XE Enterprise
 
#3

AW: Bild in Datenbank speichern - Problem

  Alt 17. Apr 2012, 09:12
- SQLQuery ist vom Typ TSQLQuery (Unit SqlExpr).
- Von den 3 Parametern werden eigentlich schon alle verwendet. Beim Speichern hab ich nachträglich noch ein rausgenommen.
- Der Rückgabewert ist zu vernachlässigen.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#4

AW: Bild in Datenbank speichern - Problem

  Alt 17. Apr 2012, 09:23
DBExpress ist nicht mein Gebiet, aber vielleicht geht Folgendes:
- Tabellen- und Feldname als Parameter entgegennehmen, die Grafik natürlich auch
- TSQLDataset/TSQLQuery innerhalb der Funktion anlegen und verbinden
- als SQL "SELECT * FROM Tabellenname WHERE 0" ausführen
- Append
- das BLOB-Feld (Parameter Feldname) befüllen
- Post
- TSQLDataset/TSQLQuery schließen und freigeben
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

AW: Bild in Datenbank speichern - Problem

  Alt 17. Apr 2012, 09:39
Also ich sehe in diesem Abschnitt ein Problem:
Delphi-Quellcode:
SQLQuery.Append;
// Auch mit SQLQuery.Edit noch getestet
TBlobField(SQLQuery.FieldByName(AField)).LoadFromStream(s);
SQLQuery.Post;
Man kann nicht einfach einen Datensatz mit einem Blobfeld in eine Tabelle speichern ohne zumindest das Primärschlüsselfeld befüllt zu haben.

Ausserdem würde ich der Funktion nicht eine SQL-Query + Feldname als String übergeben, sondern gleich ein TField-Objekt.
Also z.B. so:
(das .Append und das .Post habe ich entfernt
auch der harte Cast auf TBlobfield war gefährlich
ausserdem wird jetzt auch der Result-Wert befüllt
und das schlechte Exception-Handling was auch unnötig)

Delphi-Quellcode:
function TDatabaseConnection.SetImage(field:TField): boolean;
var
  s: TMemoryStream;
begin;
  s := TMemoryStream.Create;
  try
    s.LoadFromFile('*BILDPFAD*\*BILDNAME*.jpg');
    s.Position := 0;
    result := s.Size > 0;
    if result then
      (field as TBlobField).LoadFromStream(s);
  finally
    s.Free;
  end;
end;
  Mit Zitat antworten Zitat
Root2k

Registriert seit: 7. Jun 2011
Ort: Ulm
49 Beiträge
 
Delphi XE Enterprise
 
#6

AW: Bild in Datenbank speichern - Problem

  Alt 17. Apr 2012, 10:15
Danke erstmal für die Beiträge!

- TSQLDataset/TSQLQuery schließen und freigeben
Wenn ich das mache bekomme ich die Meldung "Eine Datenmenge, die nur zum Lesen ist, kann nicht geändert werden". Also hab ich da ein bisschen gesucht. Da liest man oft "RequestLive auf true setzen". Das TSQLQuery-Objekt besitzt allerdings keine solche Eigenschaft. Auch mit SQLQuery.Edit bin ich nicht weiter gekommen.

Also ich sehe in diesem Abschnitt ein Problem:

Man kann nicht einfach einen Datensatz mit einem Blobfeld in eine Tabelle speichern ohne zumindest das Primärschlüsselfeld befüllt zu haben.
Das Primärschlüsselfeld ist bereits gesetzt. Nur das BLOB-Feld ist noch zu befüllen.
Den Rest von deinem Beitrag nehm ich gerne zu Kenntnis, aber das hilft mir leider nicht bei dem Problem weiter. Bitte den Code auch nicht als endgültig oder super durchdacht ansehen. Mir geht es nur um die reine Funktionalität!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#7

AW: Bild in Datenbank speichern - Problem

  Alt 17. Apr 2012, 11:12
Ginge das mit einer parametrisierten Query nicht einfacher? Wobei ich wie gesagt mit DBExpress nicht vertraut bin.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Root2k

Registriert seit: 7. Jun 2011
Ort: Ulm
49 Beiträge
 
Delphi XE Enterprise
 
#8

AW: Bild in Datenbank speichern - Problem

  Alt 17. Apr 2012, 12:57
Ehrlich gesagt versteh ich da jetzt nicht so richtig wie du das meinst.
kannst du mir vielelicht ein simples Code-Beispiel geben?

Ich probier es jetzt auch mal mit anderen Komponenten... z.B. TSimpleDataSet. Vielleicht komme ich da weiter. Allerdings hab ich mit den ganzen Datenbank-Komponenten keine Erfahrung.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#9

AW: Bild in Datenbank speichern - Problem

  Alt 17. Apr 2012, 13:12
Ich dachte in etwa so:
Delphi-Quellcode:
procedure SavePictureToDB(ID: integer; const Filename: string);
begin
  SQLQuery.SQL.Text := 'UPDATE Tabelle SET Feld = :wert WHERE ID = :id';
  SQLQuery.ParamByName('id').Value := ID;
  SQLQuery.ParamByName('wert').LoadFromFile(Filename);
  SQLQuery.ExecSQL;
end;
Ungetestet.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Root2k

Registriert seit: 7. Jun 2011
Ort: Ulm
49 Beiträge
 
Delphi XE Enterprise
 
#10

AW: Bild in Datenbank speichern - Problem

  Alt 17. Apr 2012, 13:34
Ungetestet, aber funktioniert wunderbar

Nur eine Zeile hat noch nicht ganz gestimmt:
SQLQuery.ParamByName('wert').LoadFromFile(Filename, ftBlob);

Aber klappt super! Danke dir vielmals!!

*closed*

Geändert von Root2k (17. Apr 2012 um 13:46 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz