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)名前空間参照の追加
(3)フィールド宣言の追加
(5)呼び出しを追加する方法
(6)「画像の交換」のClickイベントコードを追加する
7.「ピクチャの削除」のClickイベントコードを追加
⑻「変更を保存」のClickイベントコードを追加する
9.listBox 1のSelectedIndexChangedイベントコードを追加する
(10)運転する.
画像を変更したり、textBox 1の内容を直接変更したりすることができます.
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の内容を直接変更したりすることができます.