AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi MS-Access: "Bilddaten" im Memo-Field?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Offene Frage von "Meta777"
Ein Thema von Meta777 · begonnen am 5. Jul 2007 · letzter Beitrag vom 13. Jul 2007
Antwort Antwort
Seite 1 von 2  1 2      
Meta777

Registriert seit: 8. Sep 2004
Ort: Magdeburg
248 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

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

  Alt 5. Jul 2007, 21:47
Datenbank: MS-Access • Zugriff über: ADO (Jet OLE DB 4.0)
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]
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#2

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

  Alt 5. Jul 2007, 22:38
du könntest das ganze base64-encoden.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Meta777

Registriert seit: 8. Sep 2004
Ort: Magdeburg
248 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

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

  Alt 6. Jul 2007, 07:00
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...

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?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 6. Jul 2007, 07:19
Versuch es doch mal mit .ReadBuffer()
Markus Kinzler
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

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

  Alt 6. Jul 2007, 07:34
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

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

  Alt 6. Jul 2007, 08:59
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
  Mit Zitat antworten Zitat
Meta777

Registriert seit: 8. Sep 2004
Ort: Magdeburg
248 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

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

  Alt 6. Jul 2007, 16:04
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 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 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
  Mit Zitat antworten Zitat
Benutzerbild von spacewolf
spacewolf

Registriert seit: 24. Apr 2003
Ort: Magdeburg
218 Beiträge
 
Delphi 7 Professional
 
#8

"Bilddaten" im Memo-Field?

  Alt 9. Jul 2007, 11:06
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
Andreas Göllner
("`-''-/").___..--''"`-._
`6_ 6 ) `-. ( ).`-.__.`)
"Ich kann Dir nur die Tür zeigen, durchgehen musst Du ganz allein."
Wer ist die Tür? Jesus!
  Mit Zitat antworten Zitat
Horu98716

Registriert seit: 5. Jul 2007
9 Beiträge
 
Delphi 2 Client/Server
 
#9

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

  Alt 12. Jul 2007, 09:22
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.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

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

  Alt 12. Jul 2007, 09:29
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 20:46 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