【2/17】今年は「濃厚」技術トーク!@ITメールセミナー スラッシュドット    はてなブックマーク  Yahoo!ブックマークに登録  印刷
 

.NET TIPS

[ASP.NET]データベースに登録したバイナリ・データを表示するには?

山田 祥寛
2005/01/28

 「TIPS:[ASP.NET]バイナリ・データをアップロードしてデータベースに登録するには?」では、ExcelワークシートやPDF文書、画像ファイルのようなバイナリ・データをデータベース上に登録する方法について紹介した。本稿では、その続編として、このTIPSで登録したバイナリ・データをWebフォーム上から呼び出す方法について紹介する。

 次の画面は本稿で作成するサンプル・プログラムを実行した結果だ。

本稿で紹介するサンプル・プログラムの実行結果
DropDownListコントロールのプルダウン・メニューで指定されたファイルの中身を表示している。

 なお、本稿のサンプル・プログラムを利用するに当たっては、前掲のTIPSで紹介したimage_dataテーブルがデータベース上にあらかじめ用意されているものとする。

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="Server">
SqlDataReader objRs;
void Page_Load(Object sender, EventArgs e) {
  if (!Page.IsPostBack) {
    SqlConnection objDb=new SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=dotnet");
    // image_dataテーブルから取り出したファイル情報を
    // DropDownListコントロールにバインド
    SqlCommand objCom = new SqlCommand("SELECT id,title FROM image_data", objDb);
    objDb.Open();
    objRs = objCom.ExecuteReader();
    Page.DataBind();
    objDb.Close();
  }
}
void objBtn_Click(Object sender, EventArgs e) {
  SqlConnection objDb=new SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=dotnet");
  // ドキュメントIDをキーに
  // DropDownListコントロールで指定されたファイルを取得
  SqlCommand objCom = new SqlCommand("SELECT type,datum FROM image_data WHERE id=@id",objDb);
  objCom.Parameters.Add("@id", objDdp.SelectedItem.Value);
  objDb.Open();
  objRs = objCom.ExecuteReader();
  // データベースから取得したファイルを出力する。
  // typeフィールドの値をContentTypeプロパティにセットし、
  // datumフィールドの値をBinaryWriteメソッドで出力する。
  // それぞれ取得したフィールド値はキャストする必要がある。
  If (objRs.Read()) {
    Response.ContentType = (String)objRs[0];
    Response.BinaryWrite((Byte[])objRs[1]);
  }
  objDb.Close();
  // 出力の終了
  Response.End();
}
</script>
<html>
<head>
<title>バイナリデータの出力</title>
</head>
<body>
<form runat="Server">
出力データ:
<asp:DropDownList id="objDdp" runat="Server"
  DataSource="<%#objRs%>" DataTextField="title" DataValueField="id" />
<asp:Button id="objBtn" runat="Server"
  Text="出力" OnClick="objBtn_Click" />
</form>
</body>
</html>
データベースからバイナリ・データを取得し、表示する.aspxファイル(C#の場合)
 
<%@ Page Language="VB" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="Server">
Dim objRs As SqlDataReader
Sub Page_Load(sender As Object, e As EventArgs)
  If Not Page.IsPostBack Then
    Dim objDb As New SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=dotnet")
    ' image_dataテーブルから取り出したファイル情報を
    ' DropDownListコントロールにバインド
    Dim objCom As New SqlCommand("SELECT id,title FROM image_data",objDb)
    objDb.Open()
    objRs=objCom.ExecuteReader()
    Page.DataBind()
    objDb.Close()
  End If
End Sub
Sub objBtn_Click(sender As Object, e As EventArgs)
  Dim objDb As New SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=dotnet")
  ' ドキュメントIDをキーに
  ' DropDownListコントロールで指定されたファイルを取得
  Dim objCom As New SqlCommand("SELECT type,datum FROM image_data WHERE id=@id",objDb)
  objCom.Parameters.Add("@id",objDdp.SelectedItem.Value)
  objDb.Open()
  Dim objRs=objCom.ExecuteReader()
  ' データベースから取得したファイルを出力する。
  ' typeフィールドの値をContentTypeプロパティにセットし、
  ' datumフィールドの値をBinaryWriteメソッドで出力する。
  ' それぞれ取得したフィールド値はCType関数で型変換する必要がある。
  If objRs.Read() Then
    Response.ContentType=CType(objRs.Item(0),String)
    Response.BinaryWrite(CType(objRs.Item(1),Byte()))
  End If
  objDb.Close()
  ' 出力の終了
  Response.End()
End Sub
</script>
<html>
<head>
<title>バイナリデータの出力</title>
</head>
<body>
<form runat="Server">
出力データ:
<asp:DropDownList id="objDdp" runat="Server"
  DataSource="<%#objRs%>" DataTextField="title" DataValueField="id" />
<asp:Button id="objBtn" runat="Server"
  Text="出力" OnClick="objBtn_Click" />
</form>
</body>
</html>
データベースからバイナリ・データを取得し、表示する.aspxファイル(VB.NETの場合)

 実装内容の詳細はコード内のコメントを参照いただくとして、ポイントとなるのは、以下の2点だ。

(1)クライアントに送信するバイナリ・データのコンテンツタイプを明示的に指定する

 クライアントへ送信されるバイナリ・データを、クライアント側がどのように処理するかは、そのデータのコンテンツタイプによって判断される。コンテンツタイプは、前掲のTIPSですでにデータベース上にセットされているので、ここではこれをHttpResponseクラス(System.Web名前空間)のContentTypeプロパティにセットすればよい。

(2)バイナリ・データを出力するには、BinaryWriteメソッドを使う

 HttpResponseクラスのBinaryWriteメソッドは、与えられたバイト・データを、デコード処理などは一切行わずにそのままの状態でクライアントへ出力するためのものだ。似たメソッドで、Writeメソッドがあるが、こちらはあくまで文字列を出力するためのメソッドであるので、混同しないように注意すること。

 以上が理解できたら、さっそく、サンプル・プログラムを起動してみよう。冒頭のような実行結果が得られれば成功だ。End of Article

カテゴリ:Webフォーム 処理対象:データベース
使用ライブラリ:HttpResponseクラス(System.Web名前空間)
関連TIPS:[ASP.NET]バイナリ・データをアップロードしてデータベースに登録するには?
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]バイナリ・データをアップロードしてデータベースに登録するには?
[ASP.NET MVC]ASP.NET MVCでアップロードしたファイルをデータベースに登録するには?
[ASP.NET MVC]データベースから取り出したバイナリ・データを出力するには?
[ASP.NET]Webフォームから動的にPDF文書を作成するには?
アプリケーション内でデータベースをアタッチするには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」

ホワイトペーパーTechTargetジャパン

Insider.NET フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

スキルアップ/キャリアアップ(JOB@IT)

- PR -
- PR -

お勧め求人情報

キャリアアップ 〜JOB@IT
@IT Special -PR-
  企業の仮想化に足りない“発想”とは?
仮想化運用管理のキモは意外なところに!

New!
  操作もマニュアルも分かりやすい!
ユーザー視点で開発されたPC管理ツール

New!
  仮想化すればコストは削減できるか?
仮想化に必要な「3つの視点」を解説する

  セキュリティを知り尽くす上野氏が登壇!
@ITメールソリューションLive! in Tokyo

  運用管理の課題を“2つの観点”から分析
ユーザー満足度の高い「仮想環境」とは?

  世界に通用するストレージの作り方とは?
製品に込めた思いを富士通の開発者に聞く

  OSSで手間も時間も、障害も減った――
「マピオンの事例」オープンソース活用法

  「ノートPCの持ち出し禁止」で大丈夫?
情報漏えいを防ぐ管理手法とインフラは?

  1日の処理を1秒に――MySQLの達人が語る
「コスト削減」できるチューニング

  ドキュメント作成を自動化して、SEの作業
効率を大幅アップ! Visio 2007の魅力

  急速に広がるHyper-Vでのサーバ仮想化
そのベストプラクティスをデルが解説

  @IT主催セミナーで語られた、「担当者に
求められるセキュリティ対策」をレポート

  @IT「Windows 7」 特設サイトオープン!
最新情報・移行ノウハウを公開しています