DataListにDataReaderをバインドする
●DataListにSuppliers表を表示する (ch41DataList1.aspx)
DataListにOracleデータベースのSuppliers表をバインドして表示します。Suppliers表から行(レコード)を抽出するには、パッケージ(SupplierPackage)に登録されているストアドプロシージャ(GetSuppliers)を使用します。
iSQL*PlusまたはSQL*Plusを起動して、事前にパッケージ仕様部(C:\vbora\sql\SupplierPackage.sql)とパッケージ本体部(C:\vbora\sql\SupplierPackageBody.sql)を作成してください。
パッケージ仕様部(SupplierPackage.sql)
CREATE OR REPLACE PACKAGE
TYPE rcurSuppliers IS REF CURSOR;
PROCEDURE GetSuppliers(
orcurSuppliers OUT rcurSuppliers);
END SupplierPackage;
パッケージ本体部(SupplierPackageBody.sql)
CREATE OR REPLACE PACKAGE BODY
PROCEDURE GetSuppliers(
orcurSuppliers OUT rcurSuppliers) IS
BEGIN
OPEN orcurSuppliers FOR
SELECT *
FROM Suppliers
ORDER BY SupplierID;
END GetSuppliers;
END SupplierPackage;
このサンプルでは、以下のノウハウを習得することができます。
▼DataListにDataReaderをバインドする方法
▼テンプレートの編集からItemTemplateにLabelコントロールを作成する方法
▼LabelコントロールのTextプロパティにカスタム連結式を記述する方法
▼DataBinder.Evalメソッドの使い方
1. 新規フォルダ作成
VS.NETを起動してプロジェクトvboraを開きます。ソリューションエクスプローラから[vbora]を右クリックして新規フォルダ「ch4」を作成します。
2. Webフォーム追加
ソリューションエクスプローラからフォルダ[ch4]を右クリックして、新規Webフォーム「ch41DataList1」を追加します。
3. DataList作成
ツールボックスの[Webフォーム]から、DataListをドラッグ&ドロップします。デザイナにDataList1のオブジェクトが作成されます。

図 デザイナにDataList作成
4. テンプレートの編集
DataList1の右クリックから[テンプレートの編集]→[項目テンプレート]を選択します。「DataList1-項目テンプレート」が表示されたら、ツールボックスの[Webフォーム]からLabelをドラッグしてItemTemplateにドロップします。ItemTemplateにLabel1のオブジェクトが作成されます。

図 ツールボックスからLabelをドラッグしてItemTemplateにドロップ
をクリックします。「Label1データ連結」が表示されたら、右側の「Textの連結」から「カスタム連結式」を選択して、次の式を入力します。
DataBinder.Eval(Container.DataItem,"CompanyName")
[OK]をクリックしてウィンドウを閉じます。「DataList1 – 項目テンプレート」の右クリックから[テンプレート編集の終了]をクリックします。

図 Label1のTextプロパティにカスタム連結式を入力
5. コードニューに切り替え
メニューバーから[表示]→[コード]を選択してコードビューに切り替えます。クラスモジュールの先頭に、以下のImportsステートメントを追加します。
Imports Oracle.DataAccess.Client
Imports Oracle.DataAccess.Types
Page_Loadイベントに、以下のコードを追加します。
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles MyBase.Load
DataList1.DataSource = CreateDataReader("SupplierPackage.GetSuppliers")
DataList1.DataBind()
End Sub
クラスモジュールの最後に、Function CreateDataReaderを追加します。
Private Function CreateDataReader(ByVal strPackage As String) As OracleDataReader
Dim con As New OracleConnection(ConfigurationSettings.AppSettings("conStringOraNw"))
Dim cmd As New OracleCommand(strPackage, con)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("1", OracleDbType.RefCursor, ParameterDirection.Output)
con.Open()
Return cmd.ExecuteReader(CommandBehavior.CloseConnection)
End Function
6. ブラウザに表示
ソリューションエクスプローラから[ch41DataList1.aspx]を右クリックしてブラウザに表示します。DataListにSuppliers表の仕入先が表示されます。

図 DataListにSuppliers表の仕入先が表示される
■解説
DataListにSuppliers表をバインドするには、「テンプレートの編集」からItemTemplateまたはAlternatingItemTemplateにデータ連結式を記述する必要があります。ここでは、ItemTemplateにLabelオブジェクトを作成して、LabelのTextプロパティにデータ連結式を記述しています。
<asp:DataList id="DataList1" runat="server">
<ItemTemplate>
<asp:Label id=Label1 runat="server"
Text='<%#
DataBinder.Eval(Container.DataItem,"CompanyName") %>'>
</asp:Label>
</ItemTemplate>
</asp:DataList>
<ItemTemplate>
<%#
DataBinder.Eval(Container.DataItem,"CompanyName") %>
</ItemTemplate>
データの奇数行と偶数行に異なる書式を設定するには、AlternatingItemTemplateにもLabelオブジェクトを作成します。
DataListにヘッダー、フッターを表示するには、DataListの右クリックから[テンプレートの編集]→[ヘッダーおよびフッターテンプレート]を選択します。

図「テンプレートの編集」から「ヘッダーおよびフッターテンプレート」を選択
「DataList1 – ヘッダーおよびフッターテンプレート」が表示されたら、HeaderTemplateとFooterTemplateにヘッダー/フッター情報を入力します。

図 HeaderTemplate/FooterTemplateにヘッダー/フッター情報入力
Page_Loadイベントでは、DataListのDataSourceプロパティにDataReaderのオブジェクトを設定して、DataBindメソッドでDataReaderをバインドしています。CreateDataReaderメソッドは、Suppliers表のDataReaderを生成して返します。CreateDataReaderの引数には、パッケージに登録されているストアドプロシージャ(SupplierPackage.GetSuppliers)を指定します。なお、このストアドプロシージャは、REF CURSORを使用しています。
TYPE rcurSuppliers IS REF CURSOR;
PROCEDURE GetSuppliers(
orcurSuppliers OUT rcurSuppliers) IS
BEGIN
OPEN orcurSuppliers FOR
SELECT *
FROM Suppliers
ORDER BY SupplierID;
END GetSuppliers;
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles MyBase.Load
DataList1.DataSource = CreateDataReader("SupplierPackage.GetSuppliers")
DataList1.DataBind()
End Sub
OracleDataReaderオブジェクトを生成するには、OracleConnectionとOracleCommandのイスタンスを生成します。OracleConnectionの引数には、Oracleデータベースの接続文字列を指定します。OracleCommandの引数には、ストアドプロシージャとOracleConnectionのオブジェクトを指定します。
引数にストアドプロシージャを指定したときは、OracleCommandオブジェクトのCommandTypeプロパティにCommandType.StoredProcedureを設定します。
OracleConnectionオブジェクトのOpenメソッドでOracleデータベースを開いたら、ストアドプロシージャのパラメータを追加して、OracleCommandオブジェクトのExecuteReaderメソッドを実行します。ExecuteReaderメソッドは、ストアドプロシージャを実行してOracleDataReaderオブジェクトを生成します。ExecuteReaderの引数にCommandBehavior.CloseConnectionを指定したときは、OracleDataReaderを閉じたときに、OracleConnectionオブジェクトのCloseメソッドを自動的に発行して、データベースを閉じます。
Private Function CreateDataReader(ByVal strPackage As String) As OracleDataReader
Dim con As New OracleConnection(ConfigurationSettings.AppSettings("conStringOraNw"))
Dim cmd As New OracleCommand(strPackage, con)
cmd.CommandType = CommandType.StoredProcedure
con.Open()
cmd.Parameters.Add("1", OracleDbType.RefCursor, ParameterDirection.Output)
Return cmd.ExecuteReader(CommandBehavior.CloseConnection)
End Function