Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Image in Access Datenbank speichern (https://www.delphipraxis.net/133254-image-access-datenbank-speichern.html)

uwe12 28. Apr 2009 18:20

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.

DeddyH 28. Apr 2009 18:21

Re: Image in Access Datenbank speichern
 
Access ist überhaupt nicht mein Gebiet, aber ginge das nicht über einen Blobstream?

mkinzler 28. Apr 2009 18:21

Re: Image in Access Datenbank speichern
 
Wie liest du es aus?

uwe12 28. Apr 2009 18:44

Re: Image in Access Datenbank speichern
 
mit einem AdoTable über Blobstream

mkinzler 28. Apr 2009 18:50

Re: Image in Access Datenbank speichern
 
Dann schau dir doch mal die Methoden von TStream an :zwinker:

uwe12 29. Apr 2009 07:36

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?

HeinzJ 29. Apr 2009 07:46

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: http://www.donkarl.com/FAQ/FAQ2Allgemein.htm#2.2

HeinzJ

uwe12 29. Apr 2009 07:49

Re: Image in Access Datenbank speichern
 
Ich möchte das Bild aber trotzdem lieber direkt in der Datenbank speichern.

DeddyH 29. Apr 2009 08:57

Re: Image in Access Datenbank speichern
 
Schau mal hier: http://edn.embarcadero.com/article/27462

uwe12 29. Apr 2009 09:06

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;

DeddyH 29. Apr 2009 09:15

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.

uwe12 29. Apr 2009 09:18

Re: Image in Access Datenbank speichern
 
Es kommt immer die Fehlermeldung ,,Stream-Lesefehler".

DeddyH 29. Apr 2009 09:22

Re: Image in Access Datenbank speichern
 
Dann versuch es mal hiermit: http://www.swissdelphicenter.ch/torr...de.php?id=1271

uwe12 29. Apr 2009 09:34

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;

DeddyH 29. Apr 2009 09:38

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.

uwe12 29. Apr 2009 09:49

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;

DeddyH 29. Apr 2009 10:22

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;

uwe12 29. Apr 2009 10:52

Re: Image in Access Datenbank speichern
 
irgendwie kommt der fehler immernoch. ich habe keine ahnung, an was das liegen könnte.

DeddyH 29. Apr 2009 10:56

Re: Image in Access Datenbank speichern
 
In welcher Zeile kommt der Fehler denn?

uwe12 29. Apr 2009 11:01

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.

DeddyH 29. Apr 2009 11:03

Re: Image in Access Datenbank speichern
 
Nun sag doch mal, wo genau. Der Fehler muss ja erst einmal eingegrenzt werden.

uwe12 29. Apr 2009 11:04

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"

maron 30. Apr 2009 07:27

Re: Image in Access Datenbank speichern
 
dann schreib doch davor mal AdoTable1.Edit oder so, wenn die Fehlermeldung kommt...

DeddyH 30. Apr 2009 07:39

Re: Image in Access Datenbank speichern
 
In Zeile 5 steht doch explizit "ADOTable1.Edit;" :gruebel:

hoika 30. Apr 2009 08:10

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

uwe12 30. Apr 2009 08:17

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:
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;
der Fehler kommt bei AdoTable1.post;

DeddyH 30. Apr 2009 08:38

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.

uwe12 30. Apr 2009 08:40

Re: Image in Access Datenbank speichern
 
ok, danke erstmal

hoika 30. Apr 2009 09:58

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

uwe12 30. Apr 2009 11:10

Re: Image in Access Datenbank speichern
 
Das ist nie dsEdit sondern immer dsInsert...

hoika 30. Apr 2009 12:21

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:

wenn ich einen neuen datensatz anlegen möchte
Warum kein Table.Insert ?

Lass mal den ganzen Blob-Kram weg und lege nur einen leeren Record an.



Heiko

uwe12 30. Apr 2009 14:06

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;

DeddyH 30. Apr 2009 14:14

Re: Image in Access Datenbank speichern
 
Kommt denn nach dem Append noch ein Post?

hoika 30. Apr 2009 14:18

Re: Image in Access Datenbank speichern
 
Hallo,

Zitat:

Vor dem AdoTable1.edit lege ich einen neuen datensatz über Adotable1.append an.
hab hier nochmal mein quelltext.
Wie sollen wir helfen, wenn du nur die Hälfte postest.

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

uwe12 30. Apr 2009 14:48

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.

DeddyH 30. Apr 2009 14:54

Re: Image in Access Datenbank speichern
 
Also entweder Append oder Edit, so wie oben macht das ja nicht viel Sinn.

uwe12 30. Apr 2009 15:01

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.

DeddyH 30. Apr 2009 15:07

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).

mkinzler 30. Apr 2009 15:12

Re: Image in Access Datenbank speichern
 
Zitat:

Nimm doch das jetzige Append weg und mach es dorthin, wo jetzt Edit steht
Ja .Edit versetzt den aktuellen Datensatz in den Bearbeitungsmodus; .Insert fügt einen neuen datensatz vor dem bisher aktuelle ein und wechselt in den Bearbeitungsmodus, .Append fügt ihn an am Ende ein und wechselt in Bearbeitungsmodus

uwe12 30. Apr 2009 15:17

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 09:54 Uhr.
Seite 1 von 2  1 2      

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