2008-09-03 21 views
1

私はProductエントリを含むアクセステーブルにテーブルを持っていますが、カラムの1つにはOLEオブジェクトとして保存されたjpgイメージがあります。私はこのテーブルをMySQLにインポートしようとしていますが、何も動作していないようです。私はMySQLの移行ツールを試しましたが、これにはアクセスとOLEオブジェクトに関する既知の問題があります。 (問題はそれが働いていないとフィールドを空白のままにする)私はまた、this site の提案を試し、データがインポートされている間、それは転送でイメージが壊れているように見えます。私は画像をプレビューしようとすると、私はjpg画像としてディスクに保存し、それを開くしようとすると、画像が壊れているというエラーが表示されたら、私はバイナリビューを取得します。MySQLへのアクセスからOLEオブジェクトをインポート

アクセスの画像はきれいで、プレビューすることができます。アクセスはデータをOL​​Eオブジェクトとして保存しています。MySqlにインポートすると、MediumBlobフィールドに保存されます。

誰もこの問題を以前に持っていましたが、どのように解決しましたか?

答えて

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です。

1

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

0

また、olefield - AccessのOLEオブジェクトフィールドからデータを抽出するPythonモジュールもあります。 BMPファイルを正常に抽出しました。 jpeg画像ではうまくいくかもしれませんが、試していません。

関連する問題