2008-09-03 6 views
1

Ich habe eine Tabelle in einer Access-Tabelle, die Produkteinträge enthält, eine der Spalten hat ein JPG-Bild als OLE-Objekt gespeichert. Ich versuche, diese Tabelle in MySQL zu importieren, aber nichts scheint zu funktionieren. Ich habe das MySQL-Migrationstool ausprobiert, aber das hat ein bekanntes Problem mit Access- und OLE-Objekten. (Das Problem ist, es funktioniert nicht und lässt die Felder leer) Ich habe auch versucht, den Vorschlag auf this site und während die Daten importiert wird, scheint es, als ob das Bild in der Übertragung beschädigt wird. Wenn ich versuche, das Bild in der Vorschau zu sehen, bekomme ich nur eine binäre Ansicht, wenn ich es auf der Festplatte als JPG-Bild speichern und versuchen, es zu öffnen, erhalte ich eine Fehlermeldung, dass das Bild beschädigt ist.OLE-Objekt aus dem Zugriff auf MySQL importieren

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 es nach MySql importiere, wird es in einem Mediumblob-Feld gespeichert.

Hat jemand dieses Problem schon einmal gehabt und wie haben sie es gelöst?

Antwort

1

Ok, so im Interesse der Lüftung meines schmutzigen Codes in der Öffentlichkeit hier, was ich erfunden habe.
Hinweis: Dies ist ein Hack für einmal verwendet und dann weggeworfen werden.

Diese Methode verwendet eine Datenansicht mit 1 Datenzeile aus der Zugriffstabelle. Die Bilder sind in OLE-Serialisierung eingebettet, ich bin mir nicht ganz damit vertraut, wie das funktioniert, aber wie Microsoft-Apps erlauben, dass irgendein Objekt in etwas anderes eingebettet wird. (zB Bilder in Excel-Zellen). Ich musste den Serialisierungs-Junk um das Bild entfernen, also lud ich das gesamte Feld als Byte-Array und durchforstete es für 3 gleichzeitige Einträge (FF D8 FF), die den Anfang der Bilddaten innerhalb des Feldes 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 ist es eine Frage der Herausziehen dieser Daten in eine Bitmap. Also extrahiere ich für jede Zeile in der Access-Tabelle die Bitmap und aktualisiere dann den entsprechenden MySQL-Eintrag.
Es funktionierte gut, aber ich glaube, ich könnte die Serialisierung Zeug besser entfernt haben, vielleicht gibt es eine API, um es zu tun.

1

Soweit ich mich erinnere, wird die Microsoft "SQL Server Migration Assistant for Access" ordnungsgemäß OLE-Bilder migrieren, aber dies ist nur für Access-> SQLServer. Sie können dies jedoch verwenden, um zu SQLServer Express zu migrieren (kostenloser Download) und dann von SQL Server zu MySQL zu migrieren.

0

Es gibt auch olefield - Python-Modul zum Extrahieren von Daten aus OLE-Objektfeldern in Access. Ich habe erfolgreich BMP-Dateien damit extrahiert. Es könnte wahrscheinlich mit JPEG-Bildern funktionieren, aber ich habe es nicht versucht.