|   | 
          
 
            
|  
              
 .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メソッドがあるが、こちらはあくまで文字列を出力するためのメソッドであるので、混同しないように注意すること。
 以上が理解できたら、さっそく、サンプル・プログラムを起動してみよう。冒頭のような実行結果が得られれば成功だ。
 
        
 
|  
 | 
 
generated by  
 | 
 
 
 | 
 
 
	
		Insider.NET 記事ランキング
		
		
			本日
			月間