Pregunta

Tengo una tabla en una tabla de access que contiene entradas de Productos, una de las columnas tiene un jpg de la imagen se almacena como un Objeto OLE.Estoy tratando de importar esta tabla de MySQL, pero nada parece funcionar.He probado el MySQL herramienta de migración, pero que tiene un problema conocido con el Acceso y los Objetos OLE.(El problema está no funciona y deja los campos en blanco) también probé la sugerencia en este sitio y mientras se importan los datos, parece como si la imagen se está corrompido en la transferencia.Cuando le doy a vista previa de la imagen que acaba de obtener una visión binaria, si la guardo en el disco como un archivo jpg de la imagen y tratar de abrirlo me sale un error que indica que la imagen está dañado.

Las imágenes en el Acceso están en buen estado y puede ser visto de antemano.El acceso es el almacenamiento de los datos como un Objeto OLE y cuando puedo importar a MySql se guarda en un MediumBlob campo.

Alguien ha tenido este problema antes y cómo se resuelven ?

¿Fue útil?

Solución 2

Ok, así que en aras de la difusión de mi sucia código en público aquí lo que se me ocurrió.
Nota :este es un hack diseñado para ser utilizado una vez y luego se desechan.

Este Método toma en un datarowview contiene 1 fila de datos de la tabla de access.Las Imágenes están envueltos en OLE serialización, no estoy del todo familiarizado con cómo funciona esto, pero es que como Microsoft aplicaciones permiten a cualquier objeto para ser incrustado en algo más.(por ejemplo, imágenes en Celdas de Excel).Yo necesitaba para eliminar la serialización de basura alrededor de la imagen así que cargué todo el campo como una matriz de Bytes y buscado a través de ella para 3 entradas simultáneas (FF D8 FF), que representan el comienzo de los datos de la imagen dentro del campo.

    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

Entonces es una cuestión de sacar de estos datos en un mapa de bits.Así, para cada fila en la tabla de access puedo extraer el mapa de bits y, a continuación, actualizar el correspondiente MySQL entrada.
Funcionó bien, pero supongo que me podría haber retirado la seriación cosas de una mejor manera, tal vez hay una API para hacerlo.

Otros consejos

Hasta donde yo recuerdo, el de Microsoft "SQL Server Migration Assistant para el Acceso"bien migrar OLE Imágenes, pero esto es sólo para el Acceso->SQLServer.Sin embargo, lo que puedes hacer es usar esto para migrar a SQLServer Express (descarga gratuita) y, a continuación, migrar de sql server a MySQL.

También hay olefield - Módulo de Python para extraer datos de los campos objeto OLE en el Acceso.Me logró extraer los archivos BMP con ella.Probablemente se podría trabajar con imágenes en jpeg, pero yo no lo he probado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top