Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi MS-Access: "Bilddaten" im Memo-Field? (https://www.delphipraxis.net/95375-ms-access-bilddaten-im-memo-field.html)

Meta777 5. Jul 2007 22:47

Datenbank: MS-Access • Zugriff über: ADO (Jet OLE DB 4.0)

MS-Access: "Bilddaten" im Memo-Field?
 
huhu,

hab folgendes, drängelndes Problem:
Ich will einen Stream oder ähnliches benutzen um Bilddaten die in einer DB als Memofelder gespeichert sind auszulesen.
die DB ist folgendermaßen organisiert:
ein feld mit fortlaufender ID, dann gibt es ein zweites Integer Feld Namens "CTId" und eben das Memo-Feld "Bilddaten".
Vermutlich wird das zweite Integer Feld zu kennung der zusammengehörigen Memofelder benutzt. Jedenfalls bin ich davon ausgegenagen, und habe auch immer alle MemoFelder wo dieses zweite Feld gleich war als eine datei gespeichert.
Und zwar so:


Delphi-Quellcode:
var
  LCurCTId: Integer;
  LCurFile: TMemoryStream;
  LRecCnt: Integer;
  LCurRecNr: Integer;
  LFileName: String;
  LADOStream: TADOBlobStream;
begin
  LFileName := '';
  LCurCTId := 0;
  LCurRecNr := 1;
  LCurFile := TMemoryStream.Create;
  LRecCnt := ADOQuery1.RecordCount;
//  LCurFile.??? Möglichkeit die "GrowRate" zu erhöhen? 32k Blöcke, orso?
  while not ADOQuery1.Eof do begin
    SetStatusText('Verarbeite '+IntToStr(LCurRecNr)+ ' von '+IntToStr(LRecCnt)+'Datensätzen..', 2);
    LCurCTId := ADOQuery1.FieldByName('CTID').AsInteger;
    LADOStream := ADOQuery1.CreateBlobStream(ADOQuery1.FieldByName('BildDaten'),
      bmRead) as TAdoBlobStream;
    LCurFile.CopyFrom(LADOStream, 0);
    LADOStream.Clear;
    Inc(LCurRecNr);
    ADOQuery1.Next;
    if (ADOQuery1.FieldByName('CTID').AsInteger <> LCurCTId) OR ADOQuery1.Eof then begin
      LFileName := eOutputDir.Text + konPicPraef + IntToStr(LCurCTId) +
        konPicSuff;
      SetStatusText('Speicher Bild unter "'+LFileName+'"', 2);
      LCurFile.SaveToFile(LFileName);
      LCurFile.Clear;
    end;
  end;
end;
Das was dabei raus kommt haut aber nicht hin. Ist nicht lesbar.
Auch ist es komisch das die DB 41,7MB groß ist, alle gespeicherten Dateien zusammen aber nur 305KB!?! :?:

Ich hab auch mit dem ADP DB Explorer die DB geöffnet und dort steht auch "(MEMO)" auls Feldtyp für "Bilddaten".
Ich vermute das evtl. #0 beim auslesen den Stream abscheneidet weil er intern vielleicht als Memo behandelt wird?

Hat einer eine Idee wie ich wirklich alle Daten rausbekomme?

Shalom

[edit=SirThornberry]Titel korrigiert - Mfg, SirThornberry[/edit]

DGL-luke 5. Jul 2007 23:38

Re: Eilig: MS-Access: "Bilddaten" im Memo-Field?
 
du könntest das ganze base64-encoden.

Meta777 6. Jul 2007 08:00

Re: Eilig: MS-Access: "Bilddaten" im Memo-Field?
 
Zitat:

Zitat von DGL-luke
du könntest das ganze base64-encoden.

ist es mir nicht möglich die DB zu schreiben. Ich will nur das Vorhandene auslesen.
Ich habe aber dennoch ma versucht den Feldwert mit MIME64 zu dekodieren - aber erfolglos... :cry:

Bin für jeden weiteren Hinweis dankbar

PS: Ich hab das eben mal ausgerechnet und bin auf eine ungefähre Feldgröße von 32KB gekommen (mit DB-Header und und die anderen unwichtigen Felder haut das hin). Kann man irgendwie erzweingen das er immer 32KB aus dem Feld liest?

mkinzler 6. Jul 2007 08:19

Re: Eilig: MS-Access: "Bilddaten" im Memo-Field?
 
Versuch es doch mal mit .ReadBuffer()

alzaimar 6. Jul 2007 08:34

Re: Eilig: MS-Access: "Bilddaten" im Memo-Field?
 
Hast Du es schon mit Access versucht, d.h. kannst Du die Bilder denn in Access zumindest sehen? Wenn ja, dann musst Du nur die ersten 78 Bytes der Daten wegschnippeln und -wupps- hast Du ein Bitmap.

marabu 6. Jul 2007 09:59

Re: Eilig: MS-Access: "Bilddaten" im Memo-Field?
 
Hallo,

statt LADOStream.Clear würde ich LADOStream.Free verwenden um den nicht mehr benötigten BlobStream frei zu geben - oder?

In der Nähe von CopyFrom() würde ich ein bedingtes ShowMessage(IntToStr(LADOStream.Size)) einbauen, wenn ich Zweifel am korrekten Transport der binären Daten in und aus dem Access Memo-Feld hätte.

Grüße vom marabu

Meta777 6. Jul 2007 17:04

Re: Eilig: MS-Access: "Bilddaten" im Memo-Field?
 
Danke allerseits für die Tipps aber leider bin ich bis jetzt immernoch erfolglos...
Jetzt hab ich ma mit nen HexEditor die DB angeschaut und siehe da, da kann ich die Bilder quasi "sehen", jedenfalls erkenne ich dort den Header der Bilder, der im Klartext steht (Namen und sowas)...
Ich hab mal mit OpenOffice Base die DB geöffnet und dort ist nichts lesbares nur Sonderzeichen. Gibt es da vllt. ein Zeichensatzproblem oder Ähnliches?
Leider kenn ich die Struktur einer Access Datenbank nicht, sonst würd ich das fast "manuell" übern TFileStream oder so machen *hmpf*

@Alzaimar: Das geht leider nicht da wie gesagt die Bilddaten in mehreren Records aufgeteilt sind. Auch ist es kein "gäniges" Format.

Zitat:

Zitat von marabu
statt LADOStream.Clear würde ich LADOStream.Free verwenden um den nicht mehr benötigten BlobStream frei zu geben - oder?

Wird noch gemacht. War aber auch erstma nur TestKot.

Zitat:

Zitat von marabu
In der Nähe von CopyFrom() würde ich ein bedingtes ShowMessage(IntToStr(LADOStream.Size)) einbauen, wenn ich Zweifel am korrekten Transport der binären Daten in und aus dem Access Memo-Feld hätte.

Ich hab mit dem Debugger mal geprüft ob die Größe des Feldes hinhaut. Aber leider stimmt die Größe nicht. Könnte aber zu dem passen was OpenOffice-Base mir anzeigt...

Also wenn noch jmd. nen Vorschlag hat - immer her damit :stupid:

spacewolf 9. Jul 2007 12:06

"Bilddaten" im Memo-Field?
 
vllt. gibt es diverse Komponenten für Accesszugriffe welche an die offiziellen ADO Zugriffe vorbeigehen... ich hatte mal was von Apollo und div. Komponenten gehört...

Vielleicht hat jemand von euch da ne Idee...

Gottes Segen

PS:
Vllt. ACCESS über ODBC probieren statt ADO ;-)

Horu98716 12. Jul 2007 10:22

Re: MS-Access: "Bilddaten" im Memo-Field?
 
Hallo,

hatte mal ein ähnlches Problem beim speichern von blob-Objekten. Bin dann zu dem Schluss gekommen, nur die Links zu den entsprechenden Datensätzen zu speichern. Das bläht die DB nicht so auf und funktioniert problemlos.

fruendlichst

H.Rudolf.

alzaimar 12. Jul 2007 10:29

Re: MS-Access: "Bilddaten" im Memo-Field?
 
Meta777: Dein Problem ist, das diese 'Bild-Daten' in irgend einem eigenen Format dort abgelegt wurden, jedenfalls ist das nicht konform. Access selbst speichert keinen 'Klartext', denn ein Bild ist ein Bild und hat keinen Namen. Ich würde mal versuchen, den Anfang des Bitmaps zu suchen und dann einfach ab da alle Bytes in einen Stream zu packen. Den Stream dann in die Bitmap und dann könnte es funktionieren. Ohne konkrete Beispieldaten wird Dir aber keiner helfen können.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:24 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