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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top