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

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

以前有人遇到过这个问题吗?他们是如何解决的?

有帮助吗?

解决方案 2

好吧,为了在这里公开发布我的肮脏代码,我想出了什么。
笔记 :这是一个设计为使用一次然后扔掉的黑客。

此方法采用包含访问表中的 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 可以做到这一点。

其他提示

据我所知,微软“用于 Access 的 SQL Server 迁移助手" 将正确迁移 OLE 映像,但这仅适用于 Access->SQLServer。但是,您可以使用它迁移到 SQLServer Express(免费下载),然后从 SQLServer 迁移到 MySQL。

还有 奥菲尔德 - 用于从 Access 中的 OLE 对象字段中提取数据的 Python 模块。我用它成功提取了BMP文件。它可能适用于 jpeg 图像,但我还没有尝试过。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top