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 メニュー> ストアド操作 OleDB編 Tips メニュー

03.ストアドプロシージャ操作 その3

UPDATE:2007/04/20 

<< 前のTips  次のTips >>

 


その2では引数あり(IN引数のみ)のストアドプロシージャをC#から呼び出す方法を紹介しました。
今回は、OUT引数があるストアドプロシージャをC#から呼び出す方法を紹介します。

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

ストアドプロシージャは下記の通りです。もらった引数をINSERT文で書き込み、書き込み後のEMP表総件数をout_TOTALCNTにセットします。
(例によって深い意味はありません。説明用です。)

■ストアドプロシージャ3
CREATE OR REPLACE PROCEDURE SCOTT.PROCEDURE3(in_EMPNO in varchar2, in_ENAME in varchar2, in_SAL in number, out_TOTALCNT out number)
IS
BEGIN
    INSERT INTO EMP (EMPNO, ENAME, SAL) VALUES (in_EMPNO, in_ENAME, in_SAL);
    -- INSERT文実行後の総件数を取得する

    SELECT COUNT(*) into out_TOTALCNT FROM EMP;
END;
/

 ストアドプロシージャのINパラメータをVB.NETから指定する方法は前回説明した通りです。
 今回は、ストアドプロシージャのOUTパラメータをC#から受け取る方法について説明します。

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

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

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

 値の取得方法ですが、ExecuteNonQueryメソッド実行後に、OleDbParameterのValueプロパティを参照します。

 
サンプル
using System.Data.OleDb;

private void OleDB_TEST3()
{
    try
    {
        using (OleDbConnection OraConn = 
            new OleDbConnection("Provider=MSDAORA.1.Oracle;user id=scott;" + 
            "password=tiger;data source=aicnet01"))
        {
            using (OleDbCommand Cmd = new OleDbCommand())
            {
                //データベース接続を開く
                OraConn.Open();
                Cmd.Connection = OraConn;
                //コマンドタイプをストアドプロシージャにする
                Cmd.CommandType = CommandType.StoredProcedure;
                //実行するストアドプロシージャを指定
                Cmd.CommandText = "PROCEDURE3";
                //ストアドプロシージャの引数に渡す値の設定
                Cmd.Parameters.Add("in_EMPNO", OleDbType.VarChar).Value = "7777";
                Cmd.Parameters.Add("in_ENAME", OleDbType.VarChar).Value = "HIRO";
                Cmd.Parameters.Add("in_SAL", OleDbType.Decimal).Value = 500;
                //ストアドプロシージャのout用パラメータ作成
                OleDbParameter outPara = new OleDbParameter("out_TOTALCNT", OleDbType.Decimal);
                outPara.Direction = ParameterDirection.Output;
                Cmd.Parameters.Add(outPara);
                //ストアドプロシージャの実行
                Cmd.ExecuteNonQuery();

                MessageBox.Show(
                    "PROCEDURE3 正常終了 COUNT=" + outPara.Value.ToString(),
                    "SUCCESS",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Information);
            }
        }
    }
    catch (OleDbException OraEx)
    {
        // Oracle例外発生時
        MessageBox.Show(OraEx.Message, "ORACLE ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
    }
    catch (Exception ex)
    {
        // 一般例外発生時
        MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
    }
}