SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

SQL ServerとADO.NETを用いたBLOB(バイナリラージオブジェクト)の処理方法

BLOBを読み書きする方法

 では、ユーザーがPhotosテーブルの個々のレコードを追加、変更、削除するためのWebサイトを構築していきましょう。まず、新しいWebサイトを作成します。その「App_Data」フォルダに新しいデータベースを追加して、Photosテーブルを作成してもよいでしょう。

 次に、「App_Code」フォルダをWebサイトに追加して、その中に新しいクラスを作成します。そのクラス名を「Photo」とします。リスト1に、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クラスには、PhotoIDTitleDescriptionPhotoDataという4つのpublicプロパティがあります。これらはそれぞれPhotosテーブルの列に対応するものです。プロパティは、C#の自動実装プロパティの構文に従って定義されています。

 もう1つ、データベースクエリを実行する「PhotoHelper」クラスを作成します。PhotoHelperクラスは、表3に示す5つのメソッドを持ちます。

表3 PhotoHelperクラスのメソッド
メソッド名 説明
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クラスに静的コンストラクタを追加します。

リスト2 PhotoHelperクラスのコンストラクタ
private static string strConn;

static PhotoHelper()
{
   strConn = ConfigurationManager.ConnectionStrings
             ["connstr"].ConnectionString;
}

 この静的コンストラクタは単に、ConfigurationManagerクラスを用いてweb.configからデータベース接続文字列を読み取ります。取得した接続文字列は、後で使用できるように静的変数に格納しておきます。

 Insert()メソッドの処理は簡単です。リスト3にそのコードを示します。

リスト3 PhotoHelperクラスのInsert()メソッド
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を参照ください)。

リスト4 PhotoHelperクラスのUpdate()メソッド
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()メソッドの詳細は、ここでは割愛します。これらのメソッドについては、本記事に添付されたソースコードを参照してください。

次のページ

この記事は参考になりましたか?

japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Bipin Joshi(Bipin Joshi)

 コンサルティング会社BinaryIntellect Consultingを経営し、さまざまな.NET技術に関する優れたトレーニングプログラムを実施。ソフトウェアコンサルタント、メンター、数々の書籍の著者、Webマスター、Microsoft MVP、ASPInsiders会員など、さまざまな肩書きを...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3026 2008/10/06 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー