C#アクセスデータベースの画像


一、データベースにおける画像アクセス方法
  1. イメージタイプのデータを読み込む
イメージタイプのデータを読み込む方法は、次のステップに分けられます.
1)まず、データベースに対応するデータセットテーブルのimageタイプフィールドの値を、符号なしバイト配列を使用して格納します.例:
byte[]bytes=(byte[])imageタイプフィールド値
2)メモリ領域をサポートするストリームを作成するMemoryStreamクラスを使用します.つまり、MemoryStreamクラスが作成したストリームは、ディスクやネットワーク接続ではなくメモリでサポートされているストレージ領域として使用されます.コンストラクション関数は次のとおりです.
  public MemoryStream(byte[] buffer);
3)Bitmapクラスを使用して、このクラスはGDI+ビットマップをカプセル化し、このビットマップはグラフィック画像とその属性の画素データからなる.Bitmapオブジェクトは、画素データによって定義された画像を処理するためのオブジェクトである.コンストラクション関数は次のとおりです.
  public Bitmap(Stream stream);
4)フォームにPictureBoxコントロールオブジェクトを用いて画像を表示する.
  2. イメージタイプのデータを保存
イメージタイプのデータを保存する方法も、次のステップに分けられます.
1)Streamクラスを用いて,まず画像ファイルからストリームオブジェクトを取得し,そのクラスのReadメソッドを用いて画像ファイルからバイナリデータを読み出してバイト配列に格納する.Readメソッドは次のとおりです.
  public abstract int Read([In, Out] byte[] buffer, int offset, int count);
2)バイト配列の値をデータベース対応のデータセットテーブルのimageフィールドに格納する.書式:
イメージタイプフィールド=bytes;
3)データベースを更新することで、画像データを保存する機能を果たすことができます.
二、データベースにおける画像アクセスの例
次の例では、SQL Serverデータベースの画像へのアクセス方法を説明します.
(1)図のようにフォームインタフェースを設計するWindowsアプリケーションを作成する.
(2)名前空間参照の追加 using System.Data;
 using System.Data.SqlClient;
 using System.IO;

(3)フィールド宣言の追加    private string connString="server=localhost; integrated security=sspi; database=pubs";
    SqlConnection conn;
    SqlDataAdapter adapter;
    DataSet dataset;
    string sqlstr="select * from pub_info";
    conn=new SqlConnection(connString);
    adapter=new SqlDataAdapter(sqlstr,conn);
    SqlCommandBuilder builder=new SqlCommandBuilder(adapter);
    adapter.UpdateCommand=builder.GetUpdateCommand();
    dataset=new DataSet();
    adapter.Fill(dataset,"pub_info");
    // text1Box1 Text dataset pub_info pr_info
    this.textBox1.DataBindings.Add(new Binding("Text",dataset,"pub_info.pr_info"));
    for(int i=0;i<dataset.Tables[0].Rows.Count;i++)
    {
       this.listBox1.Items.Add(dataset.Tables[0].Rows[i][0]);
    }

(5)呼び出しを追加する方法    private void ShowImage()
    {
      byte[] bytes= (byte[])dataset.Tables[0].Rows[this.listBox1.SelectedIndex][1];
       MemoryStream memStream=new MemoryStream(bytes);
       try
       {
           Bitmap myImage = new Bitmap(memStream);
           this.pictureBox1.Image= myImage;
       }
       catch
       {
           this.pictureBox1.Image=null;
       }
    }

(6)「画像の交換」のClickイベントコードを追加するprivate void buttonUpdateImage_Click(object sender, System.EventArgs e)
{
    OpenFileDialog openFileDialog1=new OpenFileDialog();
    openFileDialog1.ShowDialog();
    if (openFileDialog1.FileName.Trim()!="")
  {
       Stream myStream = openFileDialog1.OpenFile();
       int length=(int)myStream.Length;
       byte[] bytes=new byte[length];
       myStream.Read(bytes,0,length);
       myStream.Close();
      dataset.Tables[0].Rows[this.listBox1.SelectedIndex][1] =bytes;
       ShowImage();
    }
}

7.「ピクチャの削除」のClickイベントコードを追加private void buttonMoveImage_Click(object sender, System.EventArgs e)
{
    byte[] bytes= System.Text.Encoding.Unicode.GetBytes("");
    dataset.Tables[0].Rows[this.listBox1.SelectedIndex][1]=
    bytes;
    ShowImage();
}

⑻「変更を保存」のClickイベントコードを追加するprivate void buttonSave_Click(object sender, System.EventArgs e)
{
    adapter.Update(dataset,"pub_info");
    MessageBox.Show(" ");
}

9.listBox 1のSelectedIndexChangedイベントコードを追加するprivate void listBox1_SelectedIndexChanged(object sender, System.EventArgs e)
{
   ShowImage();
    this.BindingContext[dataset,"pub_info"].Position
    =this.listBox1.SelectedIndex;
}

 
(10)運転する. 
画像を変更したり、textBox 1の内容を直接変更したりすることができます.