1

アクセスデータベースからデータにアクセスしているVisual Studio 2010にC#プログラムがあります。画像以外のすべての情報を取得できます。こちらの手順に従って、写真をアクセス データベースに埋め込みました。

Right-click the first field in the Image column of the table and click Insert Object.
Click Create from File, and then click Browse.
Browse to one or more Windows Bitmap (.bmp) or Device Independent Bitmap (.dib) images.      
You can find a set of BMP files, named Empid1.bmp through Empid9.bmp, at 
drive:\Program Files\Microsoft Office\OFFICE11\SAMPLES. Select the first image and click OK.

ただし、ビットマップ画像の場所を使用しました。ビットマップ属性を含むコンストラクターがありますが、テーブルにアクセスしてすべての情報を取得しようとすると、「System.Byte[] のオブジェクトを System.Drawing.Bitmap 型にキャストできません」というエラーが表示されます。画像がシステムバイトとして保存されていると言っている理由がわかりません。

このスレッドを見つけました。だから私はメモリストリームを試しましたが、同じ問題で、システムバイトをsystem.io.memorystreamに変換できません。

4

2 に答える 2

0

ビットマップ イメージを Access データベースに挿入するために質問で説明した手順では、OLE オブジェクトに埋め込まれたイメージが保存されます。C# プログラムでビットマップ イメージだけを使用する場合は、Access から取得したバイナリ データから OLE "ラッパー" を削除する必要があります。

たとえば、Access データベースから取得して、新しいBitmapオブジェクトに直接変換しようとすると...

private void Form1_Load(object sender, EventArgs e)
{
    using (var con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Public\Database1.accdb;"))
    {
        con.Open();
        using (var cmd = new OleDbCommand("SELECT LastName, FirstName, Photo FROM Clients WHERE ID=3", con))
        {
            OleDbDataReader rdr = cmd.ExecuteReader();
            rdr.Read();
            this.textBox1.Text = rdr["FirstName"].ToString();
            this.textBox2.Text = rdr["LastName"].ToString();
            byte[] photoBytes = (byte[])rdr["Photo"];
            var ms = new System.IO.MemoryStream(photoBytes);
            this.pictureBox1.Image = new System.Drawing.Bitmap(ms);
            ms.Close();
        }
        con.Close();
    }
}

...「パラメータが無効です」というエラーが表示されます。

パラメータ.png

ただし、ここで他の回答のクラスのGetImageBytesFromOLEFieldメソッドを使用してOLE「ラッパー」を削除すると...OleImageUnwrap

var ms = new System.IO.MemoryStream(OleImageUnwrap.GetImageBytesFromOLEField(photoBytes));

...それから動作します:

ハンク.png

于 2013-11-15T10:46:36.637 に答える