RepeaterDataReaderをバインドする

 

 

RepeaterEmployees表を表示する (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 EmployeePackage AS

  TYPE rcurEmployees IS REF CURSOR;

  PROCEDURE GetEmployees(

orcurEmployees OUT rcurEmployees);

END EmployeePackage;

 

パッケージ本体部 (EmployeePackageBody.sql)

CREATE OR REPLACE PACKAGE BODY EmployeePackage AS

  PROCEDURE GetEmployees(

orcurEmployees OUT rcurEmployees) IS

  BEGIN

    OPEN orcurEmployees FOR

       SELECT *

FROM Employees

       ORDER BY EmployeeID;

  END GetEmployees;

END EmployeePackage;

 

このサンプルでは、以下のノウハウを習得することができます。

 

RepeaterDataReaderをバインドする方法

RepeaterHeaderTemplateItemtemplateAlternatingItemTemplateFooterTemplateの使い方

▼データ連結タグ<#...%>の使い方

Container.DataItemの使い方

DataBinder.Evalメソッドの使い方

REF CURSORの使い方

 

1. 新規フォルダ作成

 

VS.NETを起動してプロジェクトvboraを開きます。ソリューションエクスプローラから[vbora]を右クリックして、新規フォルダ「ch3」を作成します。

 

2. Webフォーム追加

 

ソリューションエクスプローラからフォルダ[ch3]を右クリックして、新規Webフォーム「ch31Repeater1」を追加します。

 

3. Repeater作成

 

ツールボックスの[Webフォーム]から、Repeaterをドラッグ&ドロップします。デザイナにRepeater1のオブジェクトが作成されます。

 

fig3-1-1

デザイナにRepeater1作成

 

 

デザイナの最下位に表示されている[HTML]タブをクリックしてHTMLビューに切り替えます。<asp:Repeater>...</asp:Repeater>タグの間に、HeaderTemplateItemTemplateFooterTemplateを追加します。

 

 

<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)

cccHandles 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]を右クリックしてブラウザに表示します。RepeaterEmployees表の社員が表示されます。

 

fig3-1-2

RepeaterEmployees表の社員が表示される

 

 

■解説

 

RepeaterEmployees表をバインドするには、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イベントでは、RepeaterDataSourceプロパティに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)

cccHandles MyBase.Load

  Repeater1.DataSource = CreateDataReader("EmployeePackage.GetEmployees")

  Repeater1.DataBind()

End Sub

 

OracleDataReaderオブジェクトを生成するには、OracleConnectionOracleCommandのイスタンスを生成します。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