Office: (Office 2010) BLOB

Helfe beim Thema BLOB in Microsoft Access Hilfe um das Problem gemeinsam zu lösen; Hallo zusammen, Ich versuche gerade aus einer SQL-Datenbank BLOB-Daten auszulesen. Diese Daten werden vom Microsoft Business Contact Manager (BCM)... Dieses Thema im Forum "Microsoft Access Hilfe" wurde erstellt von muku, 14. Januar 2013.

  1. BLOB


    Hallo zusammen,

    Ich versuche gerade aus einer SQL-Datenbank BLOB-Daten auszulesen.
    Diese Daten werden vom Microsoft Business Contact Manager (BCM) gespeichert und verwaltet.

    Gespeichert sind keine Bilder sondern NUR Text und Zahlen.
    Ich konnte einen Teil der Daten in den Spalten der Tabelle auslesen, bekomme allerdings dieses seltsame Zeichen bei einigen Spalten:
    Code:
    Woran könnte das liegen? Welche Maßnahmen sind hier zu ergreifen um dies zu verhindern / korrekt anzuzeigen.

    Mein Anzatz aktuell:
    Code:
    Ich hoffe ihr könnt mir helfen. Ich bin auch für Optimierungsvorschläge dankbar.

    Viele Grüße
    muku

    :)
     
  2. Du musst dein Bufferarray auch wieder in den richtigen Datentyp überführen. im moment wird es von acc als string angesehen.
    Wenn der Ursprungsdatentyp in der Tabelle nicht gespeichert wurde, musst du wohl raten. Ein anhaltspukt könnte dann die Größe des OleFeld sein(4 = long, 8 = Double oder currency ...)

    Die Größe des olefeldes könntest du auch per FieldSize ermitteln
    lSize = rs.Fields(strOLEField).FieldSize
    redim buffer(lsize-1)
    Buffer = rs(strOLEField).GetChunk(0, lSize)
     
  3. Hallo daolix,
    danke für deine Antwort.
    Wenn ich in Access auf die Tabelle im Entwurfsansicht gehe, dann steht unter Felddatentyp nur "OLE-Objekt".
    D.h. ich habe keine Ahnung was für ein Datentyp sich dahinter befindet. Größen die ich bisher immer festgestellt habe waren 8 oder 50. Was wären dann 50 für Typ?

    Welchen Vorteil / Nutzen hätte das Ermitteln der Größe über "FieldSize"?
    Ich habe verstanden, dass die beiden Funktionen die Größe unterschiedlich bestimmen, allerdings weiß ich nicht, ob die Ermittlung mit "FieldSize" nun besser wäre?!


    Viele Grüße
    muku
     
  4. BLOB

    Ich wollt jetzt nicht sagen, das diese jetzt besser wäre, ich hab einfach die Zeile Dateigroesse = Nz(LenB(rs(strOLEField))) übersehen.

    Und welche Spalte mit welcher Größe wird mit seltsame Zeichen beschrieben?

    Das könnte ein String fester länge sein. Oder ein Array mit 25 Integer elementen, oder was völlig anderes. ggf müsstest du herrausfinden was und wie, in welchen format BCM die Daten speichert.

    Hätte Wäre Wenn, gehen wir davon aus das die 8er Größe ein Double ist: Code:
    Ist Luftcode, erhebt keinen Anspruch auf Richtigkeit oder Vollständigkeit, alles wie beim Lotto, ohne Gewähr.
     
  5. Hallo!
    Zusätzlich zum bereits geposteten Code hier noch ein Link auf eine Beispieldatenbank:
    OLEtoDisk

    CU
     
    Thomas Möller, 16. Januar 2013
    #5
  6. Danke für die Antworten.

    Aaaalllsoo, ein Feld kann verschiedene Textwerte enthalten, diese sind dann ensprechend unterschiedlich groß, z.B.:

    Userfield16 --> Typ laut BCM "Dropdownliste"
    mögliche Größen und der Wert(Text) aktuell:

    Größe --> Wert
    8 --> Lead
    10 --> Kunde
    4 --> VC
    ....

    Diese Werte konnte ich auslesen!
    Das seltsame Zeichen hat nach meiner Feststellung immer die Größe von 8.
    Vermutung: Es gibt im BCM, Felder mit der Deklaration Datentyp "Nummer" , Format "Ohne Dezimalanteil 1.235 -1235" (siehe Anhang Bild) welche ich bisher nicht gefunden habe. Es könnte aber auch ein Checkbox-Feld sein. Möglicherweise ist es einer dieser Feldtypen. Allerdings kann ich dann nicht pauschal sagen wenn Größe = 8 DANN .... Gibt es dazu vorschläge wie ich das lösen könnte?

    Zu dem PunkT:
    Dies hatte ich testweise mal ausprobiert. In dem Fall ist die max. mögliche Größe 100, wenn allerdings Dateigroesse größer 100 ist gibts nen Fehler ;-)

    Ich habe die Zeile wie folgt getauscht: Code:
     
  7. Dann machs halt über den Spaltennamen
    if strOLEField = DeineSpalteDieImstrOLEFieldDieKomischenZeichenHaben then... Copy in ein Double, oder currency, oder statt if schreibst du für diese Spalte einen eigene Sub/Funktion.

    Nun ich glaube auch da gibt es Probleme wenn Dateigroesse > 50 ist z.B 75
    das ergibt bei deinem Redim Preserve Buffer(75 To 100), was jetzt ein Array mit 26 Byte-Elementen ist, d.h. dein Array wird nur max. mit 26 Zeichen befüllt. Der rest wird nicht übernommen.
     
  8. BLOB

    Hallo daolix,
    ich war ein paar Tage nicht im Büro und wollte mich heute weiter mit dem Thema beschäftigen und habe prompt auch schon die erste Fehlermeldung um die Ohren gehauen bekommen.

    Code:
    Code:
    Ich habe gelesen, dass hat mit der 64bit Version von Office zu tun?!
    Hast du oder jemand anderes dazu einen Vorschlag wie man diesen Fehler bereinigt?!

    Besten Dank und viele Grüße
    muku
     
  9. Thomas Möller, 29. Januar 2013
    #9
  10. stendate, 29. Januar 2013
    #10
  11. Hallo ihr beiden,
    vielen Dank für eure Anmerkungen / Links.
    @ leider habe ich nicht verstanden wofür der Download (Office2010Win32API_PtrSafe.exe) genau ist!?

    Ich habe versucht den Code für 32 bit / 64 bit Office umzusetzen und hoffe das ich das richtig gemacht habe!

    Code:
    Ich bekomme aktuell noch die Fehlermeldung, dass VarPtr(dblVal) Typenunverträglich ist. Siehe Code unten


    Code:
    Ich freue mich über weitere Unterstützung.

    Viele Grüße
    muku
     
  12. Hallo

    von 64 bit hab ich keinen Plan (weil ichs auch nicht hab), kann aber sein das der longtyp unter 64 nicht mitwächst und varptr eine 64bit-Addresse zurückgibt. Ändere mal wie folgt (ist aber ohne Gewähr)

    Code:
    ob das jetzt stimme weiss ich nicht.
     
  13. BLOB

    Hallo daolix,
    ich hab die Deklaration wie von dir vorgeschlagen geändert und der Fehler ist verschwunden. *Smilie
    Allerding gibts jetzt beim Ausführen der Sub in folgender Zeile wohl ein Problem, da mir Access immer an der Stelle abstürzt:

    Code:
     
  14. hallo

    64 ist irgendwie die letze Sch..e.

    probiers mal so:
    Code:
    und den Aufruf dann:
    Code:
    Aber schau mal hier, das ist evtl genauer erklärt.

    Alternativ könntest du via VBA-Befehl LSet und 2 UDT's es versuchen und die RtlMoveMemory - Api rausschmeissen.
    ist aber etwas unflexibler wenn andere Dateigrößen abgearbeitet werden müssesten. Code:
     
  15. Hallo!
    Darin findest Du die für 64 Bit angepassten API-Deklarationen. Hast Du schon einmal reingeschaut?

    CU
     
    Thomas Möller, 30. Januar 2013
    #15
Thema:

BLOB

  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden