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
Vielleicht kannst Du Dir Nützliches aus dieser alten Lösung von Stephen Lebans entnehmen:
OLEtoDisc (https://www.lebans.com/oletodisk.htm)
Danke für den Hinweis.
Ich schaue es mir an.
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?
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) (https://www.vbarchiv.net/xtra/details.php?id=9038&print=1)
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 (https://learn.microsoft.com/en-us/windows/win32/api/_stg/) 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!