DataGridDataSetをバインドする

 

DataGridCustomers表を表示する (ch51DataGrid1.aspx)

 

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

 

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

 

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

CREATE OR REPLACE PACKAGE CustomerPackage AS

  TYPE rcurCustomers IS REF CURSOR;

  PROCEDURE GetCustomers(

    orcurCustomers OUT rcurCustomers);

END CustomerPackage;

 

 

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

CREATE OR REPLACE PACKAGE BODY CustomerPackage AS

  PROCEDURE GetCustomers(

    orcurCustomers OUT rcurCustomers) IS

  BEGIN

    OPEN orcurCustomers FOR

      SELECT *

FROM Customers

      ORDER BY CustomerID;

  END GetCustomers;

END CustomerPackage;

 

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

 

DataGridDataSetオブジェクトをバインドする方法

DataSetOracleデータベースのCustomers表を取り込む方法

DataGridDataSourceDataMemberプロパティの使い方

DataAdapterオブジェクトのFillメソッドの使い方

▼ストアドプロシージャの使い方

▼ストアドプロシージャのパラメータを追加する方法

▼位置パラメータ、名前指定パラメータの使い方

REF CURSORの使い方

 

 

1. 新規フォルダ作成

 

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

 

2. Webフォーム追加

 

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

 

3. DataGrid作成

 

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

 

fig5-1-1

デザイナにDataGrid作成

 

4. コードビューに切り替え

 

メニューバーから[表示][コード]を選択してコードビューに切り替えます。クラスモジュールの先頭に、以下のImportsステートメントを追加します。

 

Imports System.Data

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

  DataGrid1.DataSource = CreateDataSet("CustomerPackage.GetCustomers")

  DataGrid1.DataBind()

End Sub

 

クラスモジュールの最後に、Function CreateDataSetを追加します。

 

Private Function CreateDataSet(ByVal strPackage As String) As DataSet

  Dim con As New OracleConnection(ConfigurationSettings.AppSettings("conStringOraNw"))

  Dim cmd As New OracleCommand(strPackage, con)

  Dim da As New OracleDataAdapter

  Dim ds As New DataSet

 

  cmd.CommandType = CommandType.StoredProcedure

  cmd.Parameters.Add("1", OracleDbType.RefCursor, ParameterDirection.Output)

  da.SelectCommand = cmd

  da.Fill(ds)

  Return ds

End Function

 

5. ブラウザに表示

 

ソリューションエクスプローラから[ch51DataGrid1.aspx]を右クリックしてブラウザに表示します。DataGridCustomers表のすべての列が表示されます。

 

fig5-1-2

DataGridCustomers表のすべての列が表示される

 

 

■解説

 

DataGridDataSetを表示するには、DataGridDataSourceプロパティにDataSetのオブジェクトを設定して、DataBindメソッドでバインドします。DataSetに複数の表(テーブル)が格納されているときは、DataMemberプロパティに表名(テーブル名)を設定します。

 

da.Fill(ds, "Customers")

da.Fill(ds, "Suppliers")

 

DataGrid1.DataSource = ds

DataGrid1.DataMember = "Customers"

DataGrid1.DataBind()

 

Page_Loadイベントでは、CreateDataSetメソッドを実行してDataSetオブジェクトを生成しています。CreateDataSetメソッドの引数には、パッケージ(CustomerPackage)に登録されているプロシージャ(GetCustomers)を指定しています。DataGridDataSourceプロパティにDataSetオブジェクトを設定したら、DataBindメソッドを実行してDataSetをバインドします。これで、DataGridCustomers表のすべての列が表示されます。DataGridは、DataSetに格納されている表のすべての列を自動的に表示します。特定の列のみ表示するには、AutoGenerateColumnsプロパティにFalseを設定します。

 

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)

cccHandles MyBase.Load

  DataGrid1.DataSource = CreateDataSet("CustomerPackage.GetCustomers")

  DataGrid1.DataBind()

End Sub

 

CreateDataSetメソッドは、OracleConnectionOracleCommandOracleDataAdapterDataSetのインスタンスを生成します。OracleConnectionの引数には、Oracleデータベースの接続文字列を指定します。ここでは、データベースの接続文字列をWeb.configファイルから取得しています。

 

OracleCommandの引数には、パッケージのストアドプロシージャとOracleConnectionのオブジェクトを指定します。ストアドプロシージャ(GetCustomers)は、SELECT文を使用してCustomers表のすべての列を返します。

 

TYPE rcurCustomers IS REF CURSOR;

 

PROCEDURE GetCustomers(

  orcurCustomers OUT rcurCustomers) IS

BEGIN

  OPEN orcurCustomers FOR

    SELECT *

FROM Customers

    ORDER BY CustomerID;

END GetCustomers;

 

OracleCommandにストアドプロシージャを指定するときは、CommandTypeプロパティにCommandType.StoredProcedureを設定する必要があります。SELECT文でREF CURSORを使用しているときは、出力パラメータを追加する必要があります。

 

パラメータには、位置パラメータと名前指定パラメータがありますが、ここでは位置パラメータを使用しています。位置パラメータを使用するときは、SELECT文に記述した順番にパラメータを追加します。

 

cmd.BindByName = False

cmd.Parameters.Add("1", OracleDbType.Char, 20, "Apple" , ParameterDirection.Input)

cmd.Parameters.Add("2", OracleDbType.Decimal, 4, 100, ParameterDirection.Input)

cmd.Parameters.Add("3", OracleDbType.RefCursor, ParameterDirection.Output)

 

名前指定パラメータのときは、パラメータの順番に関係なく追加することができます。なお、名前指定パラメータを使用するときは、OracleCommandBindByNameプロパティにTrueを設定します。

 

cmd.BindByName = True

cmd.Parameters.Add("orcurProducts", OracleDbType.RefCursor, ParameterDirection.Output)

cmd.Parameters.Add("iProductName", OracleDbType.Char, 20, "Apple" , ParameterDirection.Input)

cmd.Parameters.Add("iPrice", OracleDbType.Decimal, 4, 100, ParameterDirection.Input)

 

OracleDataAdapterSelectCommandプロパティにOracleCommandのオブジェクトを設定したら、OracleDataAdapterオブジェクトのFillメソッドを実行します。Fillメソッドの引数にはDataSetを指定します。DataSetに複数の表(テーブル)を格納するときは、da.Fill(ds, "Customers")のように表名(テーブル名)も指定します。

 

Private Function CreateDataSet(ByVal strPackage As String) As DataSet

  Dim con As New OracleConnection(ConfigurationSettings.AppSettings("conStringOraNw"))

  Dim cmd As New OracleCommand(strPackage, con)

  Dim da As New OracleDataAdapter

  Dim ds As New DataSet

 

  cmd.CommandType = CommandType.StoredProcedure

  cmd.Parameters.Add("1", OracleDbType.RefCursor, ParameterDirection.Output)

  da.SelectCommand = cmd

  da.Fill(ds)

  Return ds

End Function