Importieren Sie ein OLE-Objekt von Access nach MySQL
-
09-06-2019 - |
Frage
Ich habe eine Tabelle in einer Zugriffstabelle, die Produkteinträge enthält. In einer der Spalten ist ein JPG-Bild als OLE-Objekt gespeichert.Ich versuche, diese Tabelle in MySQL zu importieren, aber es scheint nichts zu funktionieren.Ich habe das MySQL-Migrationstool ausprobiert, aber es gibt ein bekanntes Problem mit Access und OLE-Objekten.(Das Problem ist, dass es nicht funktioniert und die Felder leer bleiben.) Ich habe den Vorschlag auch ausprobiert Diese SeiteUnd während die Daten importiert werden, scheint es, als würde das Bild bei der Übertragung beschädigt.Wenn ich versuche, eine Vorschau des Bildes anzuzeigen, erhalte ich nur eine Binäransicht. Wenn ich es als JPG-Bild auf der Festplatte speichere und versuche, es zu öffnen, erhalte ich eine Fehlermeldung, die besagt, dass das Bild beschädigt ist.
Die Bilder in Access sind in Ordnung und können in der Vorschau angezeigt werden.Access speichert die Daten als OLE-Objekt und wenn ich sie in MySql importiere, werden sie in einem MediumBlob-Feld gespeichert.
Hat jemand dieses Problem schon einmal gehabt und wie hat er es gelöst?
Lösung 2
Ok, im Interesse der Öffentlichkeit meines schmutzigen Codes hier, was ich mir ausgedacht habe.
Notiz :Dies ist ein Hack, der dazu gedacht ist, einmal verwendet und dann weggeworfen zu werden.
Diese Methode übernimmt eine Datenzeilenansicht, die eine Datenzeile aus der Zugriffstabelle enthält.Die Bilder sind in OLE-Serialisierung eingebettet. Ich bin nicht ganz damit vertraut, wie das funktioniert, aber so ermöglichen Microsoft-Apps die Einbettung jedes Objekts in etwas anderes.(zB Bilder in Excel-Zellen).Ich musste den Serialisierungsmüll um das Bild herum entfernen, also habe ich das gesamte Feld als Byte-Array geladen und es nach drei gleichzeitigen Einträgen (FF D8 FF) durchsucht, die den Anfang der Bilddaten innerhalb des Felds darstellen.
Private Function GetImageFromRow(ByRef row As DataRowView, ByVal columnName As String) As Bitmap
Dim oImage As Bitmap = New Bitmap("c:\default.jpg")
Try
If Not IsDBNull(row(columnName)) Then
If row(columnName) IsNot Nothing Then
Dim mStream As New System.IO.MemoryStream(CType(row(columnName), Byte()))
If mStream.Length > 0 Then
Dim b(Convert.ToInt32(mStream.Length - 1)) As Byte
mStream.Read(b, 0, Convert.ToInt32(mStream.Length - 1))
Dim position As Integer = 0
For index As Integer = 0 To b.Length - 3
If b(index) = &HFF And b(index + 1) = &HD8 And b(index + 2) = &HFF Then
position = index
Exit For
End If
Next
If position > 0 Then
Dim jpgStream As New System.IO.MemoryStream(b, position, b.Length - position)
oImage = New Bitmap(jpgStream)
End If
End If
End If
End If
Catch ex As Exception
Throw New ApplicationException(ex.Message, ex)
End Try
Return oImage
End Function
Dann geht es darum, diese Daten in eine Bitmap zu übertragen.Also extrahiere ich für jede Zeile in der Zugriffstabelle die Bitmap und aktualisiere dann den entsprechenden MySQL-Eintrag.
Es hat gut funktioniert, aber ich schätze, ich hätte das Serialisierungszeug auf eine bessere Art und Weise entfernen können, vielleicht gibt es dafür eine API.
Andere Tipps
Soweit ich mich erinnere, ist das Microsoft „SQL Server-Migrationsassistent für Access„ migriert OLE-Bilder ordnungsgemäß, dies gilt jedoch nur für Access->SQLServer.Sie können dies jedoch nutzen, um auf SQLServer Express (kostenloser Download) zu migrieren und dann von SQLServer auf MySQL zu migrieren.
Es gibt auch Olefield – Python-Modul zum Extrahieren von Daten aus OLE-Objektfeldern in Access.Ich habe damit erfolgreich BMP-Dateien extrahiert.Es könnte wahrscheinlich mit JPEG-Bildern funktionieren, aber ich habe es nicht ausprobiert.