1

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

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

誰かが以前にこの問題を抱えていましたか、そして彼らはどのようにそれを解決しましたか?

4

3 に答える 3

1

私が覚えている限り、Microsoftの「 SQLServer Migration Assistant for Access」はOLEイメージを適切に移行しますが、これはAccess->SQLServerの場合のみです。ただし、これを使用してSQLServer Express(無料ダウンロード)に移行してから、SQLServerからMySQLに移行することができます。

于 2008-09-03T13:05:52.520 に答える
1

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

このメソッドは、アクセス テーブルから 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があります.

于 2008-09-03T15:56:58.053 に答える
0

Access の OLE オブジェクト フィールドからデータを抽出する Python モジュールである olefieldもあります。BMPファイルを正常に抽出しました。おそらくJPEG画像で動作する可能性がありますが、試したことはありません。

于 2012-04-07T23:24:42.537 に答える