从Access导入OLE对象到MySQL

时间:2008-09-03 12:55:26

标签: mysql ms-access import data-transfer

我在访问表中有一个包含Product条目的表,其中一列有一个jpg图像存储为OLE对象。我试图将此表导入MySQL,但似乎没有任何工作。我已经尝试过MySQL迁移工具,但是它有一个已知的Access和OLE Objects问题。 (问题是它不起作用,并将字段留空)我也尝试了this site的建议 在导入数据时,似乎图像在传输中被破坏了。当我尝试预览图像时,我只得到一个二进制视图,如果我将它作为jpg图像保存在磁盘上并尝试打开它,我会收到一条错误,说明图像已损坏。

Access中的图像很好,可以预览。 Access将数据存储为OLE对象,当我将其导入MySql时,它将保存在MediumBlob字段中。

之前是否有人遇到此问题以及他们是如何解决的?

3 个答案:

答案 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图像,但我还没有尝试过。