- - PR -
VB.NETでストアドプロシージャの戻り値を取得したい
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2005-08-14 04:01
初めて投稿させていただきます。
動作環境 Win2000,Oracle10g,VS.NET2002(VB.NET) やりたいこと ODPを使って、Oracleのストアドプロシージャを実行し戻り値(複数行)をデータセットに格納しデータグリッドへ表示する。 ****************************************************************************** 'ORACLEへの接続を作成 Dim conn As New OracleConnection("user id=ユーザ名; password =パスワード;data source=データソース") 'SQLコマンドを定義 Dim cmd As New OracleCommand("パッケージ名.プロシージャ名", conn) 'データアダプタを作成 Dim da As New OracleDataAdapter() 'データセットを作成 Dim ds As New DataSet("dsList") 'データテーブルをデータセットに追加 Dim dt As DataTable = ds.Tables.Add("dtList") 'データテーブルの設定(カラムを追加) Dim pkCol As DataColumn = dt.Columns.Add("a_a", Type.GetType"System.Int32")) dt.Columns.Add("b_b", Type.GetType("System.Int32")) dt.Columns.Add("c_c", Type.GetType("System.String")) dt.Columns.Add("d_d", Type.GetType("System.String")) 'プライマリキーの設定 dt.PrimaryKey = New DataColumn() {pkCol} Dim outA As OracleParameter = cmd.Parameters.Add("A", _ OracleDbType.Varchar2, ParameterDirection.Output) outA.Size = 5 Dim outB As OracleParameter = cmd.Parameters.Add("B", _ OracleDbType.Int32, ParameterDirection.Output) outB.Size = 4 Dim outC As OracleParameter = cmd.Parameters.Add("C", _ OracleDbType.Varchar2, ParameterDirection.Output) outC.Size = 80 Dim outD As OracleParameter = cmd.Parameters.Add("D", _ OracleDbType.Varchar2, ParameterDirection.Output) outD.Size = 20 'コマンドタイプを宣言 cmd.CommandType = CommandType.StoredProcedure '接続をオープン conn.Open() Dim dr As OracleDataReader = cmd.ExecuteReader dr.Read() 'データをデータセットへ格納 Dim i, count As Integer count = 0 Do While dr.Read() For i = 0 To dr.FieldCount - 1 Console.Write(dr(i) & " ") Next Console.WriteLine() count += 1 Loop MessageBox.Show(count & "レコードです。") '接続をクローズ conn.Close() 'データグリッドへ表示 Me.DataGrid.DataSource = ds.Tables("dtList") ****************************************************************************** コンパイルは正常終了し、グリッドには何も表示されません。 countの結果として0が表示されます。 PL/SQL側はOUTとして値をはきだしている様です。 OTNやMSDN等を参考にしてつぎはぎでここまで作成しましたが、VB.NETもPL/SQLも初めてなのでどこが悪いのかさっぱり分かりません。 どうぞご教授願います。 |
|
投稿日時: 2005-08-14 05:34
1. OUTPUT パラメータの内容は、(REF CURSOR を出力した場合を除き) ExecuteReader では取得できません。
2. 値を設定していない DataTable には、値は入っていません。 なんらかの方法で値を取得した後、DataTable に追加してください。 Oracle の ストアド プロシージャからの結果がほしいときは、 1. 単一あるいは一組の値が欲しい場合 OracleCommand 側に出力パラメータを追加し、ExecuteNonQuery() を実行した後にパラメータの値を取得することになります。 2. 結果セットが欲しい場合 ストアド プロシージャに REF CURSOR 型(を用いた TYPE) の 出力パラメータを作成します。これにより、ADO.NET 側では結果セットを受け取ることになるため、ExecuteReader() や DataSet.SelectCommand の設定対象となります。 となります。 |
|
投稿日時: 2005-08-14 05:36
ちなみにこのへん。
ODP.NETでOracle固有の機能を活用する |
|
投稿日時: 2005-08-16 23:21
にしざきさん早々の返信ありがとうございます。
無事解決しました。 プロシージャ側はREF CURSORをOUTする事で解決です。 CREATE OR REPLACE PACKAGE パッケージ名 IS TYPE tempCursor IS REF CURSOR; プロシージャ名(cursor OUT tempCursor); END; CREATE OR REPLACE PACKAGE BODY パッケージ名 IS プロシージャ名(cursor OUT tempCursor) IS BEGIN OPEN cursor FOR SELECT a_a,b_b,c_c,d_d FROM テーブル名; END; END; こんな感じです。 vb.net側は Dim cmd As New OracleCommand("パッケージ名.プロシージャ名", conn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("cursor", OracleDbType.RefCursor, ParameterDirection.Output) Dim da As New OracleDataAdapter(cmd) da.Fill(ds, "test") こんな感じで値を取得できました。 まだまだやりたいことは遠いですが、これでかなり進めます。 ありがとうございました。 |
1