DataGridにDataSetをバインドする
●DataGridにCustomers表を表示する (ch51DataGrid1.aspx)
DataGridにOracleデータベースのCustomers表をバインドして表示します。Customers表から行(レコード)を抽出するには、パッケージ(CustomerPackage)に登録されているストアドプロシージャ(GetCustomers)を使用します。
iSQL*PlusまたはSQL*Plusを起動して、事前にパッケージ仕様部(C:\vbora\sql\CustomerPackage.sql)とパッケージ本体部(C:\vbora\sql\CustomerPackageBody.sql)を作成してください。
パッケージ仕様部(CustomerPackage.sql)
CREATE OR REPLACE PACKAGE
TYPE rcurCustomers IS REF CURSOR;
PROCEDURE GetCustomers(
orcurCustomers OUT rcurCustomers);
END CustomerPackage;
パッケージ本体部(CustomerPackageBody.sql)
CREATE OR REPLACE PACKAGE BODY
PROCEDURE GetCustomers(
orcurCustomers OUT rcurCustomers) IS
BEGIN
OPEN orcurCustomers FOR
SELECT *
FROM Customers
ORDER BY CustomerID;
END GetCustomers;
END CustomerPackage;
このサンプルでは、以下のノウハウを習得することができます。
▼DataGridにDataSetオブジェクトをバインドする方法
▼DataSetにOracleデータベースのCustomers表を取り込む方法
▼DataGridのDataSource、DataMemberプロパティの使い方
▼DataAdapterオブジェクトのFillメソッドの使い方
▼ストアドプロシージャの使い方
▼ストアドプロシージャのパラメータを追加する方法
▼位置パラメータ、名前指定パラメータの使い方
▼REF CURSORの使い方
1. 新規フォルダ作成
VS.NETを起動してプロジェクトvboraを開きます。ソリューションエクスプローラから[vbora]を右クリックして、新規フォルダ「ch5」を作成します。
2. Webフォーム追加
ソリューションエクスプローラからフォルダ[ch5]を右クリックして、新規Webフォーム「ch51DataGrid1」を追加します。
3. DataGrid作成
ツールボックスの[Webフォーム]から、DataGridをドラッグ&ドロップします。デザイナにDataGrid1のオブジェクトが作成されます。

図 デザイナに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)
Handles 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]を右クリックしてブラウザに表示します。DataGridにCustomers表のすべての列が表示されます。

図 DataGridにCustomers表のすべての列が表示される
■解説
DataGridにDataSetを表示するには、DataGridのDataSourceプロパティに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)を指定しています。DataGridのDataSourceプロパティにDataSetオブジェクトを設定したら、DataBindメソッドを実行してDataSetをバインドします。これで、DataGridにCustomers表のすべての列が表示されます。DataGridは、DataSetに格納されている表のすべての列を自動的に表示します。特定の列のみ表示するには、AutoGenerateColumnsプロパティにFalseを設定します。
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles MyBase.Load
DataGrid1.DataSource = CreateDataSet("CustomerPackage.GetCustomers")
DataGrid1.DataBind()
End Sub
CreateDataSetメソッドは、OracleConnection、OracleCommand、OracleDataAdapter、DataSetのインスタンスを生成します。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)
名前指定パラメータのときは、パラメータの順番に関係なく追加することができます。なお、名前指定パラメータを使用するときは、OracleCommandのBindByNameプロパティに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)
OracleDataAdapterのSelectCommandプロパティに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