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 ?

Était-ce utile?

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é.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top