Importer un objet OLE depuis Access vers MySQL
-
09-06-2019 - |
Question
J'ai une table dans une table d'accès qui contient des entrées de produit, l'une des colonnes contient une image jpg stockée en tant qu'objet OLE.J'essaie d'importer cette table dans MySQL mais rien ne semble fonctionner.J'ai essayé l'outil de migration MySQL mais il présente un problème connu avec Access et OLE Objects.(Le problème étant que cela ne fonctionne pas et laisse les champs vides) J'ai également essayé la suggestion sur ce siteet pendant que les données sont importées, il semble que l'image soit corrompue lors du transfert.Lorsque j'essaie de prévisualiser l'image, j'obtiens simplement une vue binaire. Si je l'enregistre sur le disque en tant qu'image jpg et que j'essaie de l'ouvrir, j'obtiens une erreur indiquant que l'image est corrompue.
Les images dans Access sont correctes et peuvent être prévisualisées.Access stocke les données en tant qu'objet OLE et lorsque je les importe dans MySql, elles sont enregistrées dans un champ MediumBlob.
Quelqu'un a-t-il déjà eu ce problème et comment l'a-t-il résolu ?
La solution 2
Ok, donc dans l'intérêt de diffuser mon code sale en public, voici ce que j'ai proposé.
Note :il s'agit d'un hack conçu pour être utilisé une fois puis jeté.
Cette méthode prend en compte une datarowview contenant 1 ligne de données de la table d'accès.Les images sont enveloppées dans la sérialisation OLE, je ne suis pas tout à fait familier avec comment cela fonctionne, mais c'est ainsi que les applications Microsoft permettent à n'importe quel objet d'être intégré dans autre chose.(par exemple, des images dans des cellules Excel).J'avais besoin de supprimer les fichiers de sérialisation autour de l'image, j'ai donc chargé l'intégralité du champ sous forme de tableau d'octets et recherché 3 entrées simultanées (FF D8 FF) qui représentent le début des données d'image dans le champ.
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
Il s'agit ensuite d'extraire ces données dans un bitmap.Ainsi, pour chaque ligne de la table d'accès, j'extrais le bitmap, puis je mets à jour l'entrée MySQL correspondante.
Cela a bien fonctionné, mais je suppose que j'aurais pu supprimer les éléments de sérialisation d'une meilleure manière, il existe peut-être une API pour le faire.
Autres conseils
Pour autant que je me souvienne, Microsoft "Assistant de migration SQL Server pour Access" migrera correctement les images OLE, mais ce n'est que pour Access->SQLServer.Cependant, vous pouvez l'utiliser pour migrer vers SQLServer Express (téléchargement gratuit), puis migrer de SQLServer vers MySQL.
Il y a aussi olefield - Module Python pour extraire les données des champs d'objets OLE dans Access.J'ai réussi à extraire les fichiers BMP avec.Cela pourrait probablement fonctionner avec des images jpeg, mais je ne l'ai pas essayé.