Importar objeto OLE do Access para MySQL
-
09-06-2019 - |
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?
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.