RepeaterにDataReaderをバインドする
●RepeaterにEmployees表を表示する (ch31Repeater1.aspx)
Repeaterに、OracleデータベースのEmployees表をバインドして表示します。Employees表から行(レコード)を抽出するには、パッケージ(EmployeePackage)に登録されているストアドプロシージャ(GetEmployees)を使用します。
iSQL*PlusまたはSQL*Plusを起動して、事前にパッケージ仕様部(C:\vbora\sql\EmployeePackage.sql)とパッケージ本体部(C:\vbora\sql\EmployeePackageBody.sql)を作成してください。
パッケージ仕様部 (EmployeePackage.sql)
CREATE OR REPLACE PACKAGE
TYPE rcurEmployees IS REF CURSOR;
PROCEDURE GetEmployees(
orcurEmployees OUT rcurEmployees);
END EmployeePackage;
パッケージ本体部 (EmployeePackageBody.sql)
CREATE OR REPLACE PACKAGE BODY
PROCEDURE GetEmployees(
orcurEmployees OUT rcurEmployees) IS
BEGIN
OPEN orcurEmployees FOR
SELECT *
FROM Employees
ORDER BY EmployeeID;
END GetEmployees;
END EmployeePackage;
このサンプルでは、以下のノウハウを習得することができます。
▼RepeaterにDataReaderをバインドする方法
▼RepeaterのHeaderTemplate、Itemtemplate、AlternatingItemTemplate、FooterTemplateの使い方
▼データ連結タグ<#...%>の使い方
▼Container.DataItemの使い方
▼DataBinder.Evalメソッドの使い方
▼REF CURSORの使い方
1. 新規フォルダ作成
VS.NETを起動してプロジェクトvboraを開きます。ソリューションエクスプローラから[vbora]を右クリックして、新規フォルダ「ch3」を作成します。
2. Webフォーム追加
ソリューションエクスプローラからフォルダ[ch3]を右クリックして、新規Webフォーム「ch31Repeater1」を追加します。
3. Repeater作成
ツールボックスの[Webフォーム]から、Repeaterをドラッグ&ドロップします。デザイナにRepeater1のオブジェクトが作成されます。

図 デザイナにRepeater1作成
デザイナの最下位に表示されている[HTML]タブをクリックしてHTMLビューに切り替えます。<asp:Repeater>...</asp:Repeater>タグの間に、HeaderTemplate、ItemTemplate、FooterTemplateを追加します。
<asp:Repeater id="Repeater1" runat="server">
<HeaderTemplate>
<ul type="square">
</HeaderTemplate>
<ItemTemplate>
<li>
<%# Container.DataItem("Name") %>
</li>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>
4. コードビューに切り替え
メニューバーから[表示]→[コード]を選択してコードビューに切り替えます。クラスモジュールの先頭に、以下の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
Repeater1.DataSource = CreateDataReader("EmployeePackage.GetEmployees")
Repeater1.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
con.Open()
cmd.Parameters.Add("1", OracleDbType.RefCursor, ParameterDirection.Output)
Return cmd.ExecuteReader(CommandBehavior.CloseConnection)
End Function
5. ブラウザに表示
ソリューションエクスプローラから[ch31Repeater1]を右クリックしてブラウザに表示します。RepeaterにEmployees表の社員が表示されます。

図 RepeaterにEmployees表の社員が表示される
■解説
RepeaterにEmployees表をバインドするには、HTMLビューに切り替えて<asp:Repeater>...</asp:Repeater>の間に<ItemTemplate>.または<AlternatingItemTemplate>を追加する必要があります。ItemTemplateは奇数行、AlternatingItemTemplateは偶数行のデータを定義します。
Employees表の列を表示するには、データ連結タグ<%#...%>を使用します。たとえば、氏名の列(Name)を表示するには、以下のように記述します。
<%# Container.DataItem("Name") %>
氏名をフォーマットする必要があるときは、以下のようにDataBinder.Evalメソッドを使用します。
<%# DataBinder.Eval(Container.DataItem,"Name","<b>氏名({0})</b>") %>
氏名はプレースホルダーと呼ばれる「{0}」の場所に挿入されます。数量、金額などの列をバインドするときは、データ型と小数点以下の桁数を指定することもできます。
<%# DataBinder.Eval(Container.DataItem,"Quantity","{0:n0}") %>
<%# DataBinder.Eval(Container.DataItem,"Price","{0:c2}") %>
{0:n0}の「n0」は、数値型で小数点以下の桁数が0であることを意味します。{0:c2}の「c2」は、通貨型で小数点以下の桁数を2桁で表示することを意味します。
Repeaterにヘッダー、フッターを表示するには、<HeaderTemplate>と<FooterTemplate>を追加します。ここでは、ヘッダー/フッターに<ul>の開始/終了タグを埋め込んでいます。
<asp:Repeater id="Repeater1" runat="server">
<HeaderTemplate>
<ul type="square">
</HeaderTemplate>
<ItemTemplate>
<li>
<%# Container.DataItem("Name") %>
</li>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>
Page_Loadイベントでは、RepeaterのDataSourceプロパティにDataReaderのオブジェクトを設定して、DataBindメソッドでDataReaderをバインドしています。CreateDataReaderメソッドは、Employees表のDataReaderを生成して返します。CreateDataReaderの引数には、パッケージに登録されているストアドプロシージャ(EmployeePackage.GetEmployees)を指定します。なお、このストアドプロシージャは、REF CURSORを使用しています。
TYPE rcurEmployees IS REF CURSOR;
PROCEDURE GetEmployees(
orcurEmployees OUT rcurEmployees) IS
BEGIN
OPEN orcurEmployees FOR
SELECT *
FROM Employees
ORDER BY EmployeeID;
END GetEmployees;
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles MyBase.Load
Repeater1.DataSource = CreateDataReader("EmployeePackage.GetEmployees")
Repeater1.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