代码之家  ›  专栏  ›  技术社区  ›  SecretDeveloper

从MySQL访问导入OLE对象

  •  1
  • SecretDeveloper  · 技术社区  · 18 年前

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

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

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

    3 回复  |  直到 14 年前
        1
  •  1
  •   DAC    18 年前

    据我所知,微软 SQL Server Migration Assistant for Access “将正确迁移OLE映像,但这仅用于访问->sqlserver。但是,您可以使用它迁移到sqlserver express(免费下载),然后从sqlserver迁移到mysql。

        2
  •  1
  •   SecretDeveloper    18 年前

    好吧,为了在公共场合公开我的肮脏代码,我想到了什么。
    注意:这是一个设计用来一次使用然后扔掉的黑客。

    此方法接受包含访问表中1行数据的DataRowView。这些图像被封装在OLE序列化中,我并不完全熟悉它是如何工作的,但它是如何让微软的应用程序将任何对象嵌入到其他对象中的。(例如图像转换成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可以做到这一点。

        3
  •  0
  •   ash    14 年前

    还有 olefield -用于从访问中的OLE对象字段中提取数据的python模块。我用它成功地提取了BMP文件。它可能适用于jpeg图像,但我没有尝试过。

    推荐文章