![]() |
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:
Das was dabei raus kommt haut aber nicht hin. Ist nicht lesbar.
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; 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] |
Re: Eilig: MS-Access: "Bilddaten" im Memo-Field?
du könntest das ganze base64-encoden.
|
Re: Eilig: MS-Access: "Bilddaten" im Memo-Field?
Zitat:
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? |
Re: Eilig: MS-Access: "Bilddaten" im Memo-Field?
Versuch es doch mal mit .ReadBuffer()
|
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.
|
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 |
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:
Also wenn noch jmd. nen Vorschlag hat - immer her damit :stupid: |
"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 ;-) |
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. |
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 23:23 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