BLOBを読み書きする方法
では、ユーザーがPhotosテーブルの個々のレコードを追加、変更、削除するためのWebサイトを構築していきましょう。まず、新しいWebサイトを作成します。その「App_Data」フォルダに新しいデータベースを追加して、Photosテーブルを作成してもよいでしょう。
次に、「App_Code」フォルダをWebサイトに追加して、その中に新しいクラスを作成します。そのクラス名を「Photo」とします。リスト1に、Photoクラスを示します。
public class Photo
{
public int PhotoID { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public byte[] PhotoData { get; set; }
}
Photoクラスには、PhotoID、Title、Description、PhotoDataという4つのpublicプロパティがあります。これらはそれぞれPhotosテーブルの列に対応するものです。プロパティは、C#の自動実装プロパティの構文に従って定義されています。
もう1つ、データベースクエリを実行する「PhotoHelper」クラスを作成します。PhotoHelperクラスは、表3に示す5つのメソッドを持ちます。
| メソッド名 | 説明 |
| int Insert (Photo) | Photosテーブルに新しい写真エントリを挿入し、処理に成功した場合は1を返す。 |
| int Update (Photo) | 既存の写真エントリの内容を更新し、処理に成功した場合は1を返す。 |
| int Delete (int) | 既存の写真エントリを削除する。 |
| List<Photo> GetAll() | Photosテーブルのすべてのレコードに対するPhotoオブジェクトのジェネリックリストを返す。 |
| Photo GetByID (int) | 引数のPhotoIDで指定された写真エントリを表す1つのPhotoオブジェクトを返す。 |
これらのメソッドをコーディングする前に、まずリスト2に示すように、PhotoHelperクラスに静的コンストラクタを追加します。
private static string strConn;
static PhotoHelper()
{
strConn = ConfigurationManager.ConnectionStrings
["connstr"].ConnectionString;
}
この静的コンストラクタは単に、ConfigurationManagerクラスを用いてweb.configからデータベース接続文字列を読み取ります。取得した接続文字列は、後で使用できるように静的変数に格納しておきます。
Insert()メソッドの処理は簡単です。リスト3にそのコードを示します。
public static int Insert(Photo p)
{
SqlConnection cnn = new SqlConnection(strConn);
SqlCommand cmd = new SqlCommand();
cmd.Connection = cnn;
cmd.CommandText = "insert into photos(title,description,photo)
values(@title,@description,@photo)";
SqlParameter title = new SqlParameter("@title", p.Title);
SqlParameter description = new SqlParameter("@description",
p.Description);
SqlParameter photo=new SqlParameter("@photo", SqlDbType.VarBinary);
photo.Value=p.PhotoData;
cmd.Parameters.Add(title);
cmd.Parameters.Add(description);
cmd.Parameters.Add(photo);
cnn.Open();
int i=cmd.ExecuteNonQuery();
cnn.Close();
return i;
}
Insert()メソッドでは、SqlCommandオブジェクトのExecuteNonQuery()メソッドを使用して、新しい写真レコードをPhotosテーブルに追加します。太字で示されたコードに着目してください。バイナリデータを表すphotoパラメータは、VarBinaryデータ型で生成されています。photoパラメータのValueプロパティには、写真データを含むバイト配列が格納されます。
Update()メソッドは、UPDATEステートメントを実行する点を除いて、Insert()メソッドとほぼ同様です(リスト4を参照ください)。
public static int Update(Photo p)
{
SqlConnection cnn = new SqlConnection(strConn);
SqlCommand cmd = new SqlCommand();
cmd.Connection = cnn;
cmd.CommandText = "update photos set title=@title,description=
@description,photo=@photo
where photoid=@photoid";
SqlParameter title = new SqlParameter("@title", p.Title);
SqlParameter description = new SqlParameter("@description",
p.Description);
SqlParameter photo = new SqlParameter("@photo", SqlDbType.VarBinary);
photo.Value = p.PhotoData;
SqlParameter photoid = new SqlParameter("@photoid",
p.PhotoID);
cmd.Parameters.Add(title);
cmd.Parameters.Add(description);
cmd.Parameters.Add(photo);
cmd.Parameters.Add(photoid);
cnn.Open();
int i = cmd.ExecuteNonQuery();
cnn.Close();
return i;
}
Update()とDelete()メソッドの詳細は、ここでは割愛します。これらのメソッドについては、本記事に添付されたソースコードを参照してください。
