現在オフラインです。再接続するためにインターネットの接続を待っています

ASP.NET のデータ連結について

この記事は、以前は次の ID で公開されていました: JP307860
この資料では、次の Microsoft .NET Framework クラス ライブラリの名前空間を参照しています。
  • System.Data
  • System.Data.SqlClient
概要
この資料では、ASP.NET のデータ連結について説明します。

ASP.NET の概要については、以下のサポート技術情報を参照してください。
305140 ASP.NET ロードマップ
詳細
ASP.NET のデータ連結では、あらゆるサーバー コントロールを単純なプロパティ、コレクション、式、およびメソッドに連結できます。データ連結を使用すると、データベースまたはその他の方法で提供されるデータを使用する場合の柔軟性が高まります。

この資料では、データ連結に関する以下のトピックを扱います。

データ連結の基礎

<%# %> 構文

ASP.NET では新しい宣言構文 <%# %> が導入されています。これは .aspx ページ内でデータ連結を使用する場合の基礎となる構文です。すべてのデータ連結式は、これらの記号の中に入れる必要があります。以下の例は、さまざまなソースからの単純なデータ連結を示したものです。
  • 単純なプロパティ (customer の構文)
    <%# custID %>					
  • コレクション (order の構文)
    <asp:ListBox id="List1" datasource='<%# myArray %>' runat="server">					
  • 式 (contact の構文)
    <%# ( customer.First Name + " " + customer.LastName ) %>					
  • メソッドの結果 (outstanding balance の構文)
    <%# GetBalance(custID) %>					
上記の例では、インラインの <%# %> タグによって、特定のデータ ソースからの情報を .aspx ページ内のどこに配置するかを指定しています。以下のデータ連結例では、TextBox Web サーバー コントロールを使用します。
<asp:textbox id=txt text="<%# custID %>" runat=server />				
データ連結構文の詳細については、以下の .NET Framework Software Development Kit (SDK) ドキュメントを参照してください。

Page.DataBind() versus Control.DataBind()

.aspx ページ上のオブジェクトに対して、特定のデータ ソースを指定し、設定した後、これらのデータ ソースにデータを連結する必要があります。データをデータ ソースに連結するには、Page.DataBind メソッドまたは Control.DataBind メソッドを使用できます。

この 2 つのメソッドの動作はよく似ています。主な違いは、Page.DataBind メソッドが呼び出された後は、すべてのデータ ソースがサーバー コントロールに連結されるという点です。明示的に Web サーバー コントロールの DataBind メソッドを呼び出すか、ページ レベルの Page.DataBind メソッドを呼び出すまで、データはコントロールにレンダリングされません。一般に、Page.DataBind (または、DataBind) は、Page_Load イベントから呼び出されます。

DataBind メソッドの詳細については、以下の .NET Framework SDK ドキュメントを参照してください。

Control.DataBind メソッド
http://msdn.microsoft.com/ja-jp/library/w5e5992d.aspx

データ連結リスト コントロール

リスト コントロールは、コレクションに連結できる特殊な Web サーバー コントロールです。これらのコントロールを使用すると、複数行のデータをカスタマイズされたテンプレート形式で表示できます。すべてのリスト コントロールは、コレクションへの連結に使用される DataSource プロパティおよび DataMember プロパティを公開します。

これらのコントロールでは、その DataSource プロパティを、IEnumerable、ICollection、または IListSource の各インターフェイスをサポートする任意のコレクションに連結できます。

Repeater コントロール

Repeater コントロールは、テンプレートを使用するデータ連結リストです。このコントロールには、"外観がない"、つまり、組み込みのレイアウトやスタイルが一切ありません。したがって、すべての HTML レイアウト、書式設定、およびスタイル タグをコントロールのテンプレートで明示的に宣言する必要があります。

以下のコード サンプルは、リスト コントロールの 1 つである Repeater コントロールを使用してデータを表示する方法を示したものです。

注: 使用する環境に合わせて接続文字列のパラメーターを変更する必要があります。

Visual Basic .NET
<%@ Page Language="vb" %><%@ Import Namespace="System.Data" %><%@ Import Namespace="System.Data.SqlClient" %><script runat="server">Sub Page_Load(sender As Object, e As EventArgs)Dim cnn As SqlConnection = New SqlConnection("server=(local);" & _"database=pubs;Integrated Security=SSPI")Dim cmd As SqlDataAdapter = New SqlDataAdapter("select * from authors", cnn)Dim ds As DataSet = New DataSet()cmd.Fill(ds)Repeater1.DataSource = dsRepeater1.DataBind()End Sub</script><html><body><form id="Form1" method="post" runat="server"><asp:Repeater id="Repeater1" runat="server"><ItemTemplate><%# DataBinder.Eval(Container.DataItem,"au_id") %><br>	 </ItemTemplate></asp:Repeater></form></body></html>				
Visual C# .NET
<%@ Page language="c#" %><%@ Import Namespace="System.Data" %><%@ Import Namespace="System.Data.SqlClient" %><script runat="server">void Page_Load(Object sender, EventArgs e) { SqlConnection cnn = new SqlConnection("server=(local);database=pubs;Integrated Security=SSPI"); SqlDataAdapter da = new SqlDataAdapter("select * from authors", cnn); DataSet ds = new DataSet(); da.Fill(ds, "authors"); Repeater1.DataSource = ds.Tables["authors"];Repeater1.DataBind();}</script><html><body><form id="WebForm2" method="post" runat="server"><asp:Repeater id="Repeater1" runat="server"><ItemTemplate><%# DataBinder.Eval(Container.DataItem,"au_id") %><br>	 </ItemTemplate></asp:Repeater></form></body></html>				
Visual J# .NET
<%@ Page language="VJ#" %><%@ Import Namespace="System.Data" %><%@ Import Namespace="System.Data.SqlClient" %><script runat="server">void Page_Load(Object sender, EventArgs e) { SqlConnection cnn = new SqlConnection("server=(local);database=pubs;IntegratedSecurity=SSPI"); SqlDataAdapter da = new SqlDataAdapter("select * from authors", cnn); DataSet ds = new DataSet(); da.Fill(ds, "authors"); DataTableCollection dtc = ds.get_Tables();int index = dtc.IndexOf("authors");Repeater1.set_DataSource(dtc.get_Item(index));Repeater1.DataBind();}</script><html><body><form id="WebForm2" method="post" runat="server"><asp:Repeater id="Repeater1" runat="server"><ItemTemplate><%# DataBinder.Eval(Container.DataItem,"au_id") %><br></ItemTemplate></asp:Repeater></form></body></html>				
Repeater コントロールの詳細については、以下の .NET Framework SDK ドキュメントを参照してください。
Repeater Web サーバー コントロール
http://msdn.microsoft.com/ja-jp/library/x8f2zez5.aspx

DataList コントロール

DataList クラスは、豊富な機能を備えた、テンプレートを使用するデータ連結リストです。テンプレートを変更して、このコントロールをカスタマイズできます。Repeater コントロールとは異なり、DataList は表示方向を指定するレンダリングをサポートしています。また、オプションで、HTML テーブルでの実行時レンダリングも可能です。

DataList コントロールの詳細については、以下の .NET Framework SDK ドキュメントを参照してください。
DataList Web サーバー コントロール
http://msdn.microsoft.com/ja-jp/library/9cx2f3ks(VS.85).aspx

DataGrid コントロール

DataGrid コントロールは、完全な機能を備えた複数列のデータ連結グリッドです。DataGrid 内の個々の列のレイアウトをカスタマイズするには、列のタイプを "templated" に設定して列のテンプレートを変更します。DataGrid コントロールは、テンプレートを使用せずにレンダリングできるため、レポートを作成する場合に役に立ちます。また DataGrid では、列およびボタン列による選択、編集、削除、ページング、およびソートをサポートしています。

DataGrid コントロールの詳細については、以下の .NET Framework SDK ドキュメントを参照してください。
DataGrid Web サーバー コントロール
http://msdn.microsoft.com/ja-jp/library/aa710742(VS.71).aspx

データへのアクセス

ここでは、データベースのデータにアクセスし、データをリスト コントロールに連結する方法について説明します。データベースからデータを取得するには、DataSet クラスまたは DataReader クラスを使用します。

DataSet クラス

DataSet には、テーブルの構造、テーブル間の関係、データの順序付けを含む、データの完全な表現が含まれています。DataSet クラスは柔軟性が高く、データベースから XML (Extensible Markup Language) ファイルまで、あらゆる種類の情報を格納できます。また、状態を保持しないため、サーバーの接続リソースを占有することなく、クライアントからサーバーにこのクラスを渡すことができます。以下のコード サンプルは、DataSet を使用してデータをコントロールに連結する方法を示したものです。

注: 使用する環境に合わせて接続文字列のパラメーターを変更する必要があります。

Visual Basic .NET
Dim cnn As SqlConnection = New SqlConnection("server=(local);" & _"database=pubs;Integrated Security=SSPI")Dim cmd As SqlDataAdapter = New SqlDataAdapter("select * from authors", cnn)Dim ds As DataSet = New DataSet()cmd.Fill(ds)MyRepeater.DataSource = dsMyRepeater.DataBind() 				
Visual C# .NET
SqlConnection cnn = new SqlConnection("server=(local);database=pubs;Integrated Security=SSPI"); SqlDataAdapter da = new SqlDataAdapter("select * from authors", cnn); DataSet ds = new DataSet(); da.Fill(ds);MyRepeater.DataSource = ds;MyRepeater.DataBind(); 				
Visual J# .NET
SqlConnection cnn = new SqlConnection("server=(local);database=pubs;Integrated Security=SSPI"); SqlDataAdapter da = new SqlDataAdapter("select * from authors", cnn); DataSet ds = new DataSet(); da.Fill(ds); MyRepeater.set_DataSource(ds);MyRepeater.DataBind();				
DataSet クラスの詳細については、以下の .NET Framework SDK ドキュメントを参照してください。

DataReader クラス

一方、レンダリングするデータを表示するのみで変更する必要がない場合は、DataReader クラスの方がソリューションとして適している場合があります。たとえば、DataReader は前方スクロールのみのデータ カーソルであるため、DropDownList コントロールには DataReader の方が適しています。以下のコード サンプルは、SqlDataReader クラスを使用してデータをコントロールに連結する方法を示しています。

Visual Basic .NET
Dim cnn As SqlConnection = New SqlConnection("server=(local);" & _"database=pubs;Integrated Security=SSPI")Dim cmd As SqlCommand = New SqlCommand("select * from authors", cnn)cnn.Open()MyRepeater.DataSource = cmd.ExecuteReader(CommandBehavior.CloseConnection)MyRepeater.DataBind()				
Visual C# .NET
SqlConnection cnn = new SqlConnection("server=(local);database=pubs;Integrated Security=SSPI");SqlCommand cmd = new SqlCommand("select * from authors", cnn);cnn.Open();MyRepeater.DataSource = cmd.ExecuteReader(CommandBehavior.CloseConnection);MyRepeater.DataBind();				
Visual J# .NET
SqlConnection cnn = new SqlConnection("server=(local);database=pubs;Integrated Security=SSPI"); SqlCommand cmd = new SqlCommand("select * from authors", cnn); cnn.Open();MyRepeater.set_DataSource(cmd.ExecuteReader(CommandBehavior.CloseConnection));MyRepeater.DataBind();				
SqlDataReader クラスおよび ASP.NET でのデータ アクセスの詳細については、以下の .NET Framework SDK ドキュメントのトピックを参照してください。

リスト コントロール テンプレートでの連結

リスト コントロールでテンプレートを使用すると、データ ソースの個々のレコードに連結し、カスタマイズすることができます。ここでは、この処理を行う 3 つの方法について説明します。

DataBinder.Eval メソッド

データ ソースがデータベースから返されるデータを扱う場合、データ ソースには多数の情報が含まれます。汎用の DataBinder.Eval メソッドを使用してデータを返すことができます。以下のコード サンプルでは、コンテナー オブジェクトのデータ ソースから "au_id" フィールドが返されます。
<%# DataBinder.Eval(Container.DataItem,"au_id") %>				
DataBinder.Eval メソッドの詳細については、以下の .NET Framework SDK ドキュメントを参照してください。

明示的なキャスト

さらに幅広い制御が必要な場合は、明示的なキャストを使用します。明示的な変換では型変換キーワードを使用します。これらのキーワードは関数として動作しますが、コンパイラがインラインでコードを生成するため、実行速度は関数呼び出しよりも若干速くなります。以下のコード サンプルでは、明示的なキャストを使用しています。

Visual Basic .NET
' DataSource として DataTable を使用<%# CType(Container.DataItem, System.Data.DataRowView)("au_id") %>' DataSource として DataReader を使用<%# CType(Container.DataItem, System.Data.Common.DbDataRecord)("au_id") %>' DataSource として DataReader を使用<%# CType(Container.DataItem, System.Data.Common.DbDataRecord)(0) %>				
Visual C# .NET
// DataSource として DataTable を使用<%# ((System.Data.DataRowView)Container.DataItem)["au_id"] %> // DataSource として DataReader を使用<%# ((System.Data.Common.DbDataRecord)Container.DataItem)["au_id"] %>// DataSource として DataReader を使用<%# ((System.Data.Common.DbDataRecord)Container.DataItem)[0] %>				
Visual J# .NET
// DataSource として DataTable を使用<%# ((System.Data.DataRowView)Container.DataItem)["au_id"] %> // DataSource として DataReader を使用<%# ((System.Data.Common.DbDataRecord)Container.DataItem)["au_id"] %>// DataSource として DataReader を使用<%# ((System.Data.Common.DbDataRecord)Container.DataItem)[0] %>				
上記のサンプルでは、DataSet のサブセットである DataTable、または DataReader のいずれかをデータ ソースとして使用しています。

ItemDataBound event

それぞれのコントロールの ItemDataBound イベントを使用してデータを連結することもできます。このイベントは、コントロールにアイテムがデータ連結されたときに発生します。以下の HTML コード サンプルでは、ItemTemplate と共に Repeater コントロールを定義しています。
<asp:repeater id=rptr runat=server><itemtemplate><asp:label id=lblAuthorID runat=server /></itemtemplate></asp:repeater>				
ページ内には以下のメソッドが必要です。

Visual Basic .NET
public Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)  'TODO:データベースからデータを取得し、'そのデータをリスト コントロールに連結する。End Subpublic Sub rptr_OnItemDataBound(ByVal sender As Object, _ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptr.ItemDataBoundDim rec As DataRowViewrec = e.Item.DataItem'データが存在することを確認する。If Not IsDBNull(rec) ThenDim l1 As Labell1 = e.Item.FindControl("lblAuthorID")l1.Text = rec("au_id").ToString()End IfEnd Sub				
Visual C# .NET
public void Page_Init(object sender, System.EventArgs e){rptr.ItemDataBound += new RepeaterItemEventHandler(rptr_OnItemDataBound);}public void Page_Load(object sender, System.EventArgs e){// TODO: データベースからデータを取得し、// そのデータをリスト コントロールに連結する。}public void rptr_OnItemDataBound(object sender, RepeaterItemEventArgs e){System.Data.Common.DbDataRecord rec = (System.Data.Common.DbDataRecord)e.Item.DataItem;if(rec!=null) //データが存在することを確認する。   {Label l1 = (Label)e.Item.FindControl("lblAuthorID");l1.Text = rec["au_id"].ToString();   }}				
Visual J# .NET
public void Page_Init(Object sender, System.EventArgs e){rptr.add_ItemDataBound(new RepeaterItemEventHandler(rptr_OnItemDataBound));}private void Page_Load(Object sender, System.EventArgs e){// TODO: データベースからデータを取得し、// そのデータをリスト コントロールに連結する。}public void rptr_OnItemDataBound(Object sender, RepeaterItemEventArgs e){System.Data.Common.DbDataRecord rec = (System.Data.Common.DbDataRecord)e.get_Item().get_DataItem();if (rec != null) //データが存在することを確認する。            {Label l1 = (Label)e.get_Item().FindControl("lblAuthorID");l1.set_Text(((rec.get_Item("au_id")).ToString()));            }}				
databinding databound
注意 : これは、マイクロソフトのサポート組織内で直接作成された "緊急公開" の資料です。 この資料には、確認中の問題に関する現状ベースの情報が記載されています。 情報提供のスピードを優先するため、資料には誤植が含まれる可能性があり、予告なしに随時改定される場合があります。 その他の考慮事項については、使用条件を参照してください。
プロパティ

文書番号:307860 - 最終更新日: 08/23/2013 14:38:00 - リビジョン: 2.0

Microsoft ASP.NET 1.0, Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft Visual C# .NET 2002 Standard Edition, Microsoft Visual J# .NET 2003 Standard Edition, Microsoft ASP.NET 1.1, Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Visual C# .NET 2003 Standard Edition

  • kbarttyperoadmap kbdatabinding kbinfo kbservercontrols KB307860
フィードバック