3

Access DB に保存されている画像を、C# Windows アプリケーションの PictureBox の OLE オブジェクトとして読み取ろうとしています。

これを行うコードを以下に示します。

        string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Rajesh\SampleDB_2003.mdb;";
        OleDbConnection oConn = new OleDbConnection(connString);
        oConn.Open();
        string commandString = "select * from employee where id = " + id + "";
        OleDbCommand oCmd = new OleDbCommand(commandString, oConn);
        OleDbDataReader oReader = oCmd.ExecuteReader(CommandBehavior.SequentialAccess);

        while (oReader.Read())
        {
            txtID.Text = ((int)oReader.GetValue(0)).ToString();
            txtName.Text = (string)oReader.GetValue(1);
            txtAge.Text = ((int)oReader.GetValue(2)).ToString();
            txtType.Text = (string)oReader.GetValue(3);
            byte[] imageBytes = (byte[])oReader.GetValue(4);

            MemoryStream ms = new MemoryStream();
            ms.Write(imageBytes, 0, imageBytes.Length);
            Bitmap bmp = new Bitmap(ms);
            pbPassport.Image = bmp;
        }

上記のコードを実行すると、「パラメーターが無効です」という例外が次の行でスローされます。

Bitmap bmp = new Bitmap(ms)

例外メッセージから、「ms」が認識できない形式であることは明らかです。これを乗り越えるための提案はありますか?

4

5 に答える 5

1

OLE オブジェクトを簡単に読み取ることはできません。実際、画像を OLE オブジェクトとしてデータベースに保持するのは悪い習慣です。

em を BLOB オブジェクトまたはパスとファイル名として格納することをお勧めします。AccessImagine は、MS Access と C# の両方のシナリオを処理できます。ここからダウンロードできます - http://access.bukrek.net

于 2009-07-23T12:02:34.543 に答える
1

残念ながら、良い答えはありませんが、試してみたところ、同じ結果が得られたと言えます。バイト配列の最初の 78 バイトをスキップすると、うまくいくこともあれば、うまくいかないこともありました。

これは、OLE オブジェクト データ型が何らかの種類のヘッダーをフィールドに格納し、Access が OLE オブジェクトの型を認識できるようにするためです。このヘッダーが停止し、実際のデータが開始された場所を正確に特定する信頼できる方法を見つけることができませんでしたが、あきらめました。幸運を祈ります:)

于 2008-10-20T10:01:30.683 に答える
1

AccessHdr を Google 検索します。AccessHdr.cpp と AccessHdr.h への参照があります。これらは、ヘッダーなしでストリームを抽出するために何が必要かを示しています。

于 2008-10-20T14:47:51.900 に答える
0

あなたが試すことができます:

pbPassport.Image = Image.FromStream(ms);
于 2008-10-20T11:19:14.083 に答える
-1

私はあなたの正確な方法を試しましたが、代わりにファイルからのPNGデータでバイト配列を埋めたため、あなたのバイトストリームはどういうわけか破損しています。

2つのストリームを作成することをお勧めします。1つはデータベースから、もう1つはデータベース内のイメージのソースであるファイルからです。次に、それらをバイトごとに比較します。1バイトの差異がある場合でも、データベースイメージデータが破損しています。

于 2008-10-20T10:53:13.480 に答える