Pergunta

Eu tenho uma tabela em uma tabela de acesso que contém entradas de produtos, uma das colunas possui uma imagem jpg armazenada como um objeto OLE.Estou tentando importar esta tabela para o MySQL, mas nada parece funcionar.Eu tentei a ferramenta de migração MySQL, mas ela tem um problema conhecido com Access e objetos OLE.(O problema é que não funciona e deixa os campos em branco) Também tentei a sugestão em esse sitee enquanto os dados são importados, parece que a imagem está sendo corrompida na transferência.Quando tento visualizar a imagem, apenas obtenho uma visualização binária. Se eu salvá-la no disco como uma imagem jpg e tentar abri-la, recebo um erro informando que a imagem está corrompida.

As imagens no Access estão boas e podem ser visualizadas.O Access está armazenando os dados como um objeto OLE e quando eu os importo para o MySql eles são salvos em um campo MediumBlob.

Alguém já teve esse problema antes e como o resolveu?

Foi útil?

Solução 2

Ok, então, no interesse de divulgar meu código sujo em público, aqui está o que eu descobri.
Observação :este é um hack projetado para ser usado uma vez e depois jogado fora.

Este método recebe um datarowview contendo 1 linha de dados da tabela de acesso.As imagens são agrupadas em serialização OLE, não estou totalmente familiarizado com como isso funciona, mas é como os aplicativos da Microsoft permitem que qualquer objeto seja incorporado em outra coisa.(por exemplo, imagens em células do Excel).Eu precisava remover o lixo de serialização em torno da imagem, então carreguei o campo inteiro como uma matriz de bytes e procurei por 3 entradas simultâneas (FF D8 FF) que representam o início dos dados da imagem dentro do 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

Então é uma questão de extrair esses dados em um bitmap.Portanto, para cada linha da tabela de acesso, extraio o bitmap e atualizo a entrada MySQL correspondente.
Funcionou bem, mas acho que poderia ter removido o material de serialização de uma maneira melhor, talvez haja uma API para fazer isso.

Outras dicas

Pelo que me lembro, a Microsoft "Assistente de migração do SQL Server para Access" migrará corretamente as imagens OLE, mas isso é apenas para Access-> SQLServer.Porém, o que você pode fazer é usar isso para migrar para o SQLServer Express (download gratuito) e depois migrar do SQLServer para o MySQL.

Há também campo oleícola - Módulo Python para extrair dados de campos de objetos OLE no Access.Extraí com sucesso arquivos BMP com ele.Provavelmente poderia funcionar com imagens JPEG, mas ainda não tentei.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top