質問

アクセステーブルにProductエントリを含むテーブルがあり、列の1つにOLEオブジェクトとして保存されたjpg画像があります。このテーブルを MySQL にインポートしようとしていますが、何も機能しないようです。MySQL 移行ツールを試しましたが、Access および OLE オブジェクトに関する既知の問題があります。(問題は、それが機能せず、フィールドが空白のままになることです)私はまた、次の提案を試しました このサイトデータのインポート中に、転送中に画像が破損しているように見えます。画像をプレビューしようとすると、バイナリ ビューが表示されます。jpg 画像としてディスクに保存して開こうとすると、画像が壊れているというエラーが表示されます。

Access の画像は問題なく、プレビューできます。Access はデータを OLE オブジェクトとして保存しており、それを MySql にインポートすると、MediumBlob フィールドに保存されます。

以前にこの問題に遭遇した人はいますか?どうやって解決しましたか?

役に立ちましたか?

解決 2

さて、私の汚いコードをここで公開するために、私が思いついたものを公開します。
注記 :これは、一度使用したら捨てるように設計されたハックです。

このメソッドは、アクセス テーブルから 1 行のデータを含む datarowview を取得します。画像は 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