3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(.Net,SQL)SQL Server 2005に画像データ(バイナリ)を保存したい

SQL Server 2005には IMAGE という便利なデータ型ありました。これを使うと、最大2GBまでの画像を含むバイナリデータがDBに登録できるみたいです。

image型の詳細はMSDN ntext 型、text 型、image 型 (Transact-SQL)参照

ということで、SQL Server 2005に画像を挿入するプログラムを作ってみました。

ボタンを押下するとダイアログボックスで画像ファイルを選択し、それを新規レコードとして挿入する処理をしています。

なお、DBのテーブル構成は下記の通りです。

┏━━┳━━┳━━━━━━┳━━━┓

┃名前┃id ┃name ┃img ┃

┣━━╋━━╋━━━━━━╋━━━┫

┃型 ┃int ┃varchar(255)┃image ┃

┗━━┻━━┻━━━━━━┻━━━┛

DBアクセス部分はDataSetを使っています。

private void button1_Click(object sender, EventArgs e)

{

// ファイルを指定する

OpenFileDialog dlg = new OpenFileDialog();

dlg.CheckFileExists = true;

dlg.CheckPathExists = true;

dlg.DefaultExt = "bmp";

dlg.Filter = "Image Files(*.BMP;*.JPG;*.GIF)|";

dlg.Filter += "*.BMP;*.JPG;*.GIF";

DialogResult dlgResult = dlg.ShowDialog();

if (dlgResult != DialogResult.OK)

{

return;

}

 

// ビットマップパス名

string strBmpPath = dlg.FileName;

// ビットマップをロード

System.IO.FileStream stream = System.IO.File.OpenRead(strBmpPath);

System.IO.BinaryReader binRead;

// Image型はバイナリなので、バイナリデータに変換

binRead = new System.IO.BinaryReader(stream);

byte[] byt = new byte[stream.Length];

byt = binRead.ReadBytes((int)stream.Length);

// Streamをクローズ

binRead.Close();

stream.Close();

 

try

{

//DataSetを使ってデータ挿入

DataSet1TableAdapters.CustomerTableAdapter adp = new DataSet1TableAdapters.CustomerTableAdapter();

adp.InsertQuery(1, "テスト太郎", byt);

}

catch (Exception ex)

{

MessageBox.Show(ex.Message);

}

}

イメージをバイト型配列として登録するという点だけが通常の方法と違いますね。

ちなみに、参考にさせてもらったのはGoldFish イメージの挿入と取得です。

ちなみに、DB上の画像を表示するのは今回まだやっていません。

上記の参考元サイトでDBから取得したバイナリデータを一時ファイルとして保存してから再度読むようにしているみたいですが、これだとちょっとロスがありますよね。

ということで、時間があれば一時ファイルなしで直に Bitmap オブジェクトに変換できる方法を探してみたいと思います。

追記(2009/4/28)

上記のImageオブジェクトとバイト配列の変換について簡単にできる方法がありました。

詳しくは(.Net)Imageオブジェクトとバイト配列相互変換を参照。。