SHOEISHA iD

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

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

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

japan.internet.com翻訳記事

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

 次にWebフォームの分離コードファイルを作成します。リスト7に示すようなprivateメソッド(BindData())を加えます。

リスト7 DetailsViewにジェネリックリストをバインドする
private void BindData()
{
   List<Photo> photos = PhotoHelper.GetAll();
   DetailsView1.DataSource = photos;
   DetailsView1.DataBind();
}

 BindData()メソッドは、PhotoHelperクラスのGetAll()メソッドを呼び出します。返されたPhotoオブジェクトのジェネリックリストを、DetailsViewにバインドします。Page_Loadイベントは、リスト8に示すように処理します。

リスト8 デフォルトのWebフォームにおけるPage_Loadイベントハンドラ
protected void Page_Load(object sender, EventArgs e)
{
   if (!IsPostBack)
   {
      BindData();
      if (DetailsView1.Rows.Count == 0)
      {
         DetailsView1.ChangeMode(DetailsViewMode.Insert);
      }
   }
}

 ここでは単に、BindData()メソッドを呼び出しています。DetailsViewに表示する行がない場合は、モードを「Insert」に変更します。DetailsViewはデータソースコントロールにバインドされていないため、PageIndexChangingイベントとModeChangingイベントを手動で処理する必要があります(リスト9を参照してください)。

リスト9 DetailsViewのページング機能を実装する
protected void DetailsView1_PageIndexChanging
(object sender, DetailsViewPageEventArgs e)
{
   DetailsView1.PageIndex = e.NewPageIndex;
   BindData();
}
protected void DetailsView1_ModeChanging
(object sender, DetailsViewModeEventArgs e)
{
   DetailsView1.ChangeMode(e.NewMode);
   BindData();
}

 リスト9のイベントハンドラのコードは簡単なので、説明の必要はないと思います。ユーザーが新しく格納したい写真のデータを入力し、[Insertボタン]をクリックすると、DetailsViewのItemInsertingイベントが発生します。ItemInsertingイベントハンドラはリスト10に示すとおりです。

リスト10 写真を挿入する
protected void DetailsView1_ItemInserting
(object sender, DetailsViewInsertEventArgs e)
{
   Photo p = new Photo();

   TextBox t1=((TextBox)DetailsView1.Rows[0].Cells[1].Controls[0]);
   TextBox t2=((TextBox)DetailsView1.Rows[1].Cells[1].Controls[1]);
   FileUpload fu=
      ((FileUpload)DetailsView1.Rows[2].Cells[1].Controls[1]);

   p.Title = t1.Text;
   p.Description = t2.Text;

   Stream imgdatastream = fu.PostedFile.InputStream;
   int imgdatalen = fu.PostedFile.ContentLength;
   byte[] imgdata = new byte[imgdatalen];
   int n = imgdatastream.Read(imgdata, 0, imgdatalen);

   p.PhotoData = imgdata;

   PhotoHelper.Insert(p);
   BindData();
}

 ここではDetailsViewに新しく入力された値を取得し、それらをPhotoオブジェクトに代入します。ユーザーがアップロードした写真をバイト配列に変換する方法に着目してください。FileUploadコントロールのInputStreamによって、入力データにアクセスします。そのストリームをバイト配列に読み込みます。最後にPhotoHelperクラスのInsert()メソッドを呼び出して、レコードをPhotosテーブルに追加します。

 更新処理は、挿入処理を少し変更するだけです。リスト11に、ItemUpdatingイベントに対するイベントハンドラを示します。

リスト11 写真を更新する
protected void DetailsView1_ItemUpdating(object sender,
   DetailsViewUpdateEventArgs e)
{
   Photo p = new Photo();

   TextBox t1 =
      ((TextBox)DetailsView1.Rows[0].Cells[1].Controls[0]);
   TextBox t2 =
      ((TextBox)DetailsView1.Rows[1].Cells[1].Controls[1]);
   FileUpload fu =
      ((FileUpload)DetailsView1.Rows[2].Cells[1].Controls[1]);

   p.PhotoID = Convert.ToInt32(DetailsView1.DataKey[0]);
   p.Title = t1.Text;
   p.Description = t2.Text;

   Stream imgdatastream = fu.PostedFile.InputStream;
   int imgdatalen = fu.PostedFile.ContentLength;
   byte[] imgdata = new byte[imgdatalen];
   int n = imgdatastream.Read(imgdata, 0, imgdatalen);

   p.PhotoData = imgdata;

   PhotoHelper.Update(p);
   BindData();
}

 太字の行に着目してください。DataKeyコレクションを使用して更新する行のPhotoIDを取得し、PhotoHelperクラスのUpdate()メソッドを呼び出しています。

 削除処理はとても簡単です。リスト12にそのコードを示します。

リスト12 写真を削除する
protected void DetailsView1_ItemDeleting(object sender,
   DetailsViewDeleteEventArgs e)
{
   int photoid = Convert.ToInt32(DetailsView1.DataKey[0]);
   PhotoHelper.Delete(photoid);
   BindData();
}

 これでデフォルトのWebフォームが完成しました。次に、写真画像をImageコントロールに供給する「ShowPhoto.aspx」を作成しなければなりません。Webサイトに新しいWebフォームを追加し、「ShowPhoto.aspx」と名づけます。このWebフォームにはコントロールはありません。ShowPhoto.aspxのPage_Loadイベントハンドラは、リスト13のようになります。

リスト13 データベースから取得した写真をImageコントロールに表示する
protected void Page_Load(object sender, EventArgs e)
{
   int photoid = Convert.ToInt32(Request.QueryString["photoid"]);
   Photo p = PhotoHelper.GetByID(photoid);

   Response.Clear();
   Response.ContentType = "image/pjpeg";
   Response.BinaryWrite(p.PhotoData);
   Response.End();
   }

 ここではPhotoHelperクラスのGetByID()メソッドを使用して、1つの写真を取得しています。ShowPhoto.aspxは、取得する写真のPhotoIDを指定するクエリ文字列を引数とすることを思い出してください。写真データをRaw形式で格納するバイト配列は、ResponseオブジェクトのBinaryWrite()メソッドを用いて、レスポンスストリームに書き込まれます。書き込む前にResponseをクリアし、ContentTypeを「image/pjpeg」に設定している点に注意してください。

 これでWebサイトが完成しました。このデフォルトのWebフォームを実行して、レコードを追加、変更、削除できます。図2は、このWebサイトを実行した例です。

図2 デフォルトのWebサイトにデータベースからの写真が表示された状態
図2 デフォルトのWebサイトにデータベースからの写真が表示された状態

次のページ
読み出し処理の改良

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

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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー