DataListDataReaderをバインドする

 

DataListSuppliers表を表示する (ch41DataList1.aspx)

 

DataListOracleデータベースのSuppliers表をバインドして表示します。Suppliers表から行(レコード)を抽出するには、パッケージ(SupplierPackage)に登録されているストアドプロシージャ(GetSuppliers)を使用します。

 

iSQL*PlusまたはSQL*Plusを起動して、事前にパッケージ仕様部(C:\vbora\sql\SupplierPackage.sql)とパッケージ本体部(C:\vbora\sql\SupplierPackageBody.sql)を作成してください。

 

パッケージ仕様部(SupplierPackage.sql)

CREATE OR REPLACE PACKAGE SupplierPackage AS

  TYPE rcurSuppliers IS REF CURSOR;

  PROCEDURE GetSuppliers(

    orcurSuppliers OUT rcurSuppliers);

END SupplierPackage;

 

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

CREATE OR REPLACE PACKAGE BODY SupplierPackage AS

  PROCEDURE GetSuppliers(

    orcurSuppliers OUT rcurSuppliers) IS

  BEGIN

    OPEN orcurSuppliers FOR

      SELECT *

      FROM Suppliers

      ORDER BY SupplierID;

  END GetSuppliers;

END SupplierPackage;

 

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

 

DataListDataReaderをバインドする方法

▼テンプレートの編集からItemTemplateLabelコントロールを作成する方法

LabelコントロールのTextプロパティにカスタム連結式を記述する方法

DataBinder.Evalメソッドの使い方

 

1. 新規フォルダ作成

 

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

 

2. Webフォーム追加

 

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

 

3. DataList作成

 

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

 

fig4-1-1

デザイナにDataList作成

 

4. テンプレートの編集

 

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

 

fig4-1-2

ツールボックスからLabelをドラッグしてItemTemplateにドロップ

 

Label1のプロパティウィンドウから(Data Bindings)プロパティを選択してiconEllipsisをクリックします。「Label1データ連結」が表示されたら、右側の「Textの連結」から「カスタム連結式」を選択して、次の式を入力します。

 

DataBinder.Eval(Container.DataItem,"CompanyName")

 

[OK]をクリックしてウィンドウを閉じます。「DataList1 – 項目テンプレート」の右クリックから[テンプレート編集の終了]をクリックします。

 

fig4-1-3

Label1Textプロパティにカスタム連結式を入力

 

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)

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

 

fig4-1-4

DataListSuppliers表の仕入先が表示される

 

■解説

 

DataListSuppliers表をバインドするには、「テンプレートの編集」からItemTemplateまたはAlternatingItemTemplateにデータ連結式を記述する必要があります。ここでは、ItemTemplateLabelオブジェクトを作成して、LabelTextプロパティにデータ連結式を記述しています。

 

<asp:DataList id="DataList1" runat="server">

  <ItemTemplate>

    <asp:Label id=Label1 runat="server"

      Text='<%# DataBinder.Eval(Container.DataItem,"CompanyName") %>'>

    </asp:Label>

  </ItemTemplate>

</asp:DataList>

 

Labelを使用した場合、BackColor/ForeColorなどの書式を設定することができます。Labelを使用しないで、直接データ連結式を記述することもできます。

 

<ItemTemplate>

<%# DataBinder.Eval(Container.DataItem,"CompanyName") %>

</ItemTemplate>

 

データの奇数行と偶数行に異なる書式を設定するには、AlternatingItemTemplateにもLabelオブジェクトを作成します。

 

DataListにヘッダー、フッターを表示するには、DataListの右クリックから[テンプレートの編集][ヘッダーおよびフッターテンプレート]を選択します。

 

fig4-1-5

図「テンプレートの編集」から「ヘッダーおよびフッターテンプレート」を選択

 

DataList1 – ヘッダーおよびフッターテンプレート」が表示されたら、HeaderTemplateFooterTemplateにヘッダー/フッター情報を入力します。

 

 

fig4-1-6

HeaderTemplate/FooterTemplateにヘッダー/フッター情報入力

 

 

Page_Loadイベントでは、DataListDataSourceプロパティに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)

cccHandles MyBase.Load

  DataList1.DataSource = CreateDataReader("SupplierPackage.GetSuppliers")

  DataList1.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