HIRO's.NET

VB.NET, C#, PowerShell Tipsサイト

 VB.NET, C#, PowerShellを使用しているエンジニアのためのサイト。

 基本的な使用方法から開発で役立つTipsまで幅広く取り扱っています。

HIRO's.NET RSSHIRO's.NET RSS


C# 2005の開発でお困りのことはありませんか?
そんな悩みは当サイトで解決!!

HOME > C# 2005 Tips > その他 Tips メニュー> ストアド操作 ODP.NET編 Tips メニュー

05.ストアドプロシージャ操作 その5

UPDATE:2007/04/22 

<< 前のTips  次のTips >>

 


その4では、REF CURSORをOUT引数として持つストアドプロシージャをC#でDataReaderに受け取る方法を紹介しました。

今回は、REF CURSOR(OUT引数)をVB.NETでDataSetに受け取る方法を紹介します。

使用するテーブルは、Oracleを使用している人であればおなじみの、scott/tigerのEMP表です。

ストアドプロシージャは下記の通りです。もらった引数をINSERT文で書き込み、書き込み後のEMP表総件数をout_TOTALCNTにセットします。

(例によって深い意味はありません。説明用です。)
■ストアドプロシージャ5
CREATE OR REPLACE PACKAGE SCOTT.PKG_TEST2
IS
    TYPE ref_cursor IS REF CURSOR;
        Procedure PROCEDURE5(out_cursor OUT ref_cursor);
END;
/

CREATE OR REPLACE PACKAGE BODY SCOTT.PKG_TEST2 AS
Procedure PROCEDURE5 (
    out_cursor OUT ref_cursor
)
IS
BEGIN
    BEGIN
        OPEN out_cursor FOR
        SELECT * FROM EMP;
    END;
END PROCEDURE5;
END PKG_TEST2;
/

 今回は、ストアドプロシージャのOUTパラメータをC#のDataSetに受け取る方法について説明します。

 まず、OracleParameterのインスタンスを作成します。

 OracleParameterのインスタンス作成時の第1引数には、ストアドプロシージャのREF CUROSOR(OUT引数)名(この場合は"out_cursor")、第2引数にはストアドプロシージャOUT引数の型に合わせたものを指定します。(OracleDbType.RefCursor)

 次に、PrameterDirectionにOutputを指定します。(これはストアドプロシージャout_cursorがOUT引数であるため)

 あとはDataAdaptertとDataSetを作成し、DataAdapterのFillメソッドを使用することで、DataSetに結果を受け取ることができます。

 
サンプル
private void ODP_TEST5()
{
    try
    {
        using (OracleConnection OraConn = 
            new OracleConnection("user id=scott;password=tiger;data source=aicnet01"))
        {
            using (OracleCommand Cmd = new OracleCommand())
            {
                //データベース接続を開く
                OraConn.Open();
                Cmd.Connection = OraConn;
                //コマンドタイプをストアドプロシージャにする
                Cmd.CommandType = CommandType.StoredProcedure;
                //実行するストアドプロシージャを指定
                Cmd.CommandText = "PKG_TEST2.PROCEDURE5";
                //ストアドプロシージャのout cursor用パラメータ作成
                OracleParameter outPara = new OracleParameter("out_CURSOR", OracleDbType.RefCursor);
                outPara.Direction = ParameterDirection.Output;
                Cmd.Parameters.Add(outPara);

                OracleDataAdapter OraDA = new OracleDataAdapter(Cmd);
                DataSet ds = new DataSet();
                OraDA.Fill(ds, "EMP");

                dataGridView1.DataSource = ds.Tables["EMP"];

                MessageBox.Show("PROCEDURE5 正常終了", "SUCCESS", 
                    MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
    }
    catch (OracleException OraEx)
    {
        // Oracle例外発生時
        MessageBox.Show(OraEx.Message, "ORACLE ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
    }
    catch (Exception ex)
    {
        // 一般例外発生時
        MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
    }
}