我在访问表中有一个包含Product条目的表,其中一列有一个jpg图像存储为OLE对象。我试图将此表导入MySQL,但似乎没有任何工作。我已经尝试过MySQL迁移工具,但是它有一个已知的Access和OLE Objects问题。 (问题是它不起作用,并将字段留空)我也尝试了this site的建议 在导入数据时,似乎图像在传输中被破坏了。当我尝试预览图像时,我只得到一个二进制视图,如果我将它作为jpg图像保存在磁盘上并尝试打开它,我会收到一条错误,说明图像已损坏。
Access中的图像很好,可以预览。 Access将数据存储为OLE对象,当我将其导入MySql时,它将保存在MediumBlob字段中。
之前是否有人遇到此问题以及他们是如何解决的?
答案 0 :(得分:1)
据我记忆,Microsoft“SQL Server Migration Assistant for Access”将正确迁移OLE映像,但这仅适用于Access-> SQLServer。但是,您可以使用它来迁移到SQLServer Express(免费下载),然后从SQLServer迁移到MySQL。
答案 1 :(得分:1)
好的,为了在公共场合播放我的脏代码,我想出了什么。
注意:这是一个设计用于一次然后扔掉的黑客。
此方法接收包含来自访问表的1行数据的数据视图。图像包含在OLE序列化中,我不完全熟悉它的工作原理,但它是如何将Microsoft应用程序允许任何对象嵌入到其他内容中的。 (例如图像进入Excel单元格)。我需要删除图像周围的序列化垃圾,所以我将整个字段作为字节数组加载,并在其中搜索3个并发条目(FF D8 FF),表示字段中图像数据的开头。
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
然后将这些数据提取到位图中。因此,对于访问表中的每一行,我提取位图,然后更新相应的MySQL条目 它运行良好,但我猜我可以更好地删除序列化的东西,也许是一个API来做它。
答案 2 :(得分:0)
还有olefield - Python模块,用于从Access中的OLE对象字段中提取数据。我用它成功提取了BMP文件。它可能适用于jpeg图像,但我还没有尝试过。