Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

OLE Felder auslesen

Begonnen von Bopi, August 02, 2024, 09:14:39

⏪ vorheriges - nächstes ⏩

Bopi

Hallo Zusammen

Ich arbeite an einer DB welche OLE Felder hat (Wunsch der Geschäftsleitung). Die BE soll in eine PostgreSQL migriert werden. Dazu muss der Inhalt der OLE Felder auf den Typ des Inhalts geprüft werden, die Informationen der Binärdaten ausgelesen und als File gespeichert werden. Da ich diesbezüglich keine Erfahrung habe, habe ich mir AI zur Hilfe genommen. Im folgenden Code bleibt die Sub in Zeile 90 hängen mit Fehler 424 (Objekt erforderlich).
Kann mir jemand den Input geben, der mir fehlt?
Sub ExtractOLEDataWithADO()
          Dim conn As ADODB.Connection
          Dim rs As ADODB.Recordset
          Dim obj As Object
          Dim objStream As Object
          Dim strConn As String
          Dim strSQL As String
          Dim strFilePath As String
         
          ' Verbindung zur Access-Datenbank herstellen
10        strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=M:\windaten\db\Projekt\THGroup\Export_postgresql.accdb;"
20        Set conn = New ADODB.Connection
30        conn.Open strConn
         
          ' SQL-Abfrage zum Auswählen der Daten mit OLE-Feld
40        strSQL = "SELECT ID, attURL FROM tblalAttach;"
         
          ' Recordset öffnen
50        Set rs = New ADODB.Recordset
60        rs.Open strSQL, conn, adOpenStatic, adLockReadOnly, adCmdText
         
          ' Schleife über die Datensätze
70        Do While Not rs.EOF
              ' Überprüfen, ob das OLE-Feld nicht NULL ist
80            If Not IsNull(rs.Fields("attURL").Value) Then
                  ' Zugriff auf das OLE-Feld-Objekt
90                Set obj = rs.Fields("attURL").Value
                  ' Überprüfen des Typs des OLE-Objekts (z. B. Bild, Dokument usw.)
100               If TypeName(obj) = "StdPicture" Then ' Beispiel für ein Bild
                      ' ein Bild-Objekt öffnen und die Binärdaten lesen
110                   Set objStream = obj.Image.OpenBinaryStream
                      ' der Dateipfad und Dateinamen für die Ausgabe
120                   strFilePath = "M:\windaten\db\Projekt\THGroup\OLE" & rs.Fields("ID").Value & ".jpg"
                      ' Schreiben der Binärdaten in eine Datei
130                   objStream.SaveToFile strFilePath
                      ' den Stream schliessen
140                   objStream.Close
150               ElseIf TypeName(obj) = "StdDocument" Then ' Beispiel für ein Dokument
                      ' ein Dokument-Objekt öffnen und die Binärdaten lesen
160                   Set objStream = obj.Document.OpenBinaryStream
                      ' der Dateipfad und Dateinamen für die Ausgabe
170                   strFilePath = "M:\windaten\db\Projekt\THGroup\OLE" & rs.Fields("ID").Value & ".docx"
                      ' Schreiben der Binärdaten in eine Datei
180                   objStream.SaveToFile strFilePath
                      ' den Stream schliessen
190                   objStream.Close
                  ' Weitere Typen (z. B. Audio, Video) können entsprechend behandelt werden
200               End If
210           End If
             
              ' Zum nächsten Datensatz gehen
220           rs.MoveNext
230       Loop
         
          ' Recordset schließen
240       rs.Close
250       Set rs = Nothing
         
          ' Verbindung schließen
260       conn.Close
270       Set conn = Nothing
         
End Sub

Bevor ich es vergesse, ich arbeite mit Access 2019 64bit
  •  

ebs17

Vielleicht kannst Du Dir Nützliches aus dieser alten Lösung von Stephen Lebans entnehmen:
OLEtoDisc
Mit freundlichem Glück Auf!

Eberhard
  •  

Bopi

Danke für den Hinweis.
Ich schaue es mir an.
  •  

Bopi

Ich habe es mir angeschaut.
Leider ist Stephen Lebans nicht mehr aktiv. Seine Lösung ist für Access 32bit. Ich habe sie für 64bit umgebaut. Läuft aber nicht. So wie es aussieht muss die dazugehörige DLL auch angepasst werden. Das sprengt meine Möglichkeiten.
Schade.

Hat sonst noch jemand eine Idee?
  •  

ebs17

#4
ZitatSeine Lösung ist für Access 32bit.
Für eine größere und einmalige Lösung könnte man auch mal eine 32Bit-Installation anlegen.

ZitatIm folgenden Code bleibt die Sub in Zeile 90 hängen mit Fehler 424 (Objekt erforderlich).
Ich würde meinen, die Value-Eigenschaft wird kein Objekt zurückgeben. Verzichte testweise auf diese.

Siehe auch Bilder/Dokumente in Access-Datenbanken speichern (ADO)
Mit freundlichem Glück Auf!

Eberhard
  •  

PhilS

Deine AI-generierte "Lösung" ist ein wirres Sammelsurium an realitätsfernen Halluzinationen. Ich glaube nicht, dass auf der Basis irgendein sinnvolles Ergebnis zu erreichen ist.

Zitat von: Bopi am August 11, 2024, 11:47:41Leider ist Stephen Lebans nicht mehr aktiv. Seine Lösung ist für Access 32bit.
Da schließe ich mich der Empfehlung von @ebs17 an. Wenn es hier um eine einmalige Migration geht, dann setz eine VM mit 32bit Access auf und lass die Migration oder zumindest diesen Teil dort laufen.
Das Problem hier ist nicht, einfach die Binärdaten aus den einzelnen OLE-Feldern in das Dateisystem zu schreiben. Daher hilft auch der Hinweis von @ebs17 zu Bilder speichern hier nicht weiter.
Stattdessen musst du aus dem Structured Storage Container, der in der Datenbank gespeichert ist, den Teil auslesen, der die ursprüngliche Datei repräsentiert und nur diesen auf der Festplatte speichern.

ZitatIch arbeite an einer DB welche OLE Felder hat (Wunsch der Geschäftsleitung). Die BE soll in eine PostgreSQL migriert werden. Dazu muss der Inhalt der OLE Felder auf den Typ des Inhalts geprüft werden, die Informationen der Binärdaten ausgelesen und als File gespeichert werden.
Warum denn eigentlich?
Wenn deine Geschäftsleitung OLE-Felder will, warum behältst du die nicht unverändert bei? - Nicht, dass ich das empfehlen würde!
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor
  •