Entwickler-Ecke

Datenbanken - Bitmap in Datenbank schreiben und wieder auslesen


BennyM - Di 24.09.02 16:22
Titel: Bitmap in Datenbank schreiben und wieder auslesen
Hi Leute
Ich habe ein TImage und möchte dies in meiner Datenbank abspeichern ich habe dazu nur eine einfache Paradox - Tabelle genommen und das Feld vom Typ Graphic angelgt. Wie muss ich im Delphi vorgehen dass er mir das Bild abspeichert??? Und wie kann ich es danach wieder von der Datenbank in mein TImage laden??
Mfg
Benny


majolo - Di 24.09.02 20:51

Hi,

also erstens solltest du eine DBImage Komponente verwenden.Die verbindest du dann mit deinem Feld vom Typ Graphic.Dann verwende einen TOpenDialog um das Bild zu öffnen und im DBImage anzuzeigen.Und einen DBNavigator um den Datensatz hinzuzufügen.Ich glaube das müsste klappen.
Gruss
majolo


BennyM - Mi 25.09.02 11:04

hi majolo,
ein bild in ein TImage einladen funktioniert mit dem OpenPictureDialog jetzt brauch ich nur noch wie ich das bild zusätzlich zu vor- und nachnamen speichern kann und danach wieder aus der datenbank in mein TImage lesen kann!
Bisher mach ich es so:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TFMitglieder.Felder_versorgen;
begin
  with SQLMitglied do
  begin
    FieldByName('MG_Nr').AsInteger           := StrToInt(EdNr.Text);
    FieldByName('MG_Vorname').AsString   := EdVorname.Text;
    FieldByName('MG_Nachname').AsString := EdNachname.Text;
    FieldByName('MG_Bild').???                  := Bild.???
  end;
end;

'Bild' ist bei mir der Name meines Images (ein normales TImage keine DBImage) es muss doch auch irgendwie mit einem normalen TImage auch funktionieren??
Und auslesen hab ich es bisher so versucht:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TFMitglieder.Maske_fuellen;
begin
  with SQLMitglied do
  begin
    EdVorname.Text   := FieldByName('MG_Vorname').AsString;
    EdNachname.Text := FieldByName('MG_Nachname').AsString;
    Bild.???                := FieldByName('MG_Bild').???;
  end;
end;

Wäre echt super wenn mit einer helfen könnte!


LCS - Mi 25.09.02 11:18

Hi
probiers mal so.
Speichern in DB

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure Speichern;
var
  Daten : TMemoryStream;
begin
  Daten := TMemoryStream.Create;
  image.picture.graphic.SaveToStream(Daten);
  Daten.Position := 0;
  TBlobField(SQLMitgield.FieldByName('MG_Bild')).LoadFromStream(Daten);
  Daten.Free;
end;

Und zum Lesen:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure Lesen;
var
  Daten : TMemoryStream;
begin
  if not SQLMitgield.FieldByName('MG_Bild').IsNull then begin
    Daten := TMemoryStream.Create;
    TBlobField(SQLMitgield.FieldByName('MG_Bild')).SaveToStream(Daten);
    Daten.Position := 0;
    image.picture.graphic.LoadFromStream(Daten);
    Daten.Free;
  end;
end;


Ich konnts nicht testen, aber sollte in etwa hinhauen.

Gruss Lothar


BennyM - Mi 25.09.02 11:41

Hey Lothar
das Speicher funktioniert einwandfrei nur beim lesen gibts noch ein paar schwierigkeiten er bringt mir eine Zugriffsverletzung ich schau mal ob ichs hinbekomme aber falls dir was einfällt woran es liegen könnte dann sag bescheid ich sag auch bescheid wenn ichs hinbekommen hab!
Mfg
Benny


BennyM - Mi 25.09.02 13:09

Hey Lothar ich habs rausgefunden du bist beim lesen anstatt


Quelltext
1:
image.picture.[b]graphic[/b].LoadFromStream(Daten);                    



Quelltext
1:
image.picture.[b]bitmap[/b].LoadFromStream(Daten);                    


aber trotzdem vielen dank für deinen Tipp

Mfg

Benny


LCS - Mi 25.09.02 13:14

Hi
Kleine Ergänzung :

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure Lesen; 
var 
  Daten : TMemoryStream; 
  Bild : TPicture;
begin 
  if not SQLMitgield.FieldByName('MG_Bild').IsNull then begin 
    Bild := TPicture.Create;
    Daten := TMemoryStream.Create; 
    TBlobField(SQLMitgield.FieldByName('MG_Bild')).SaveToStream(Daten); 
    Daten.Position := 0; 
    TGraphic(Bild).LoadFromStream(Daten);
    image.picture.assign(Bild); 
    Daten.Free; 
    Bild.Free;
  end; 
end;


Gruss Lothar
---
Hab ich geschrieben bevor ich deinen letzten Post gelesen habe. Wenns funzt dann ignoriers einfach :D