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 メニュー

04.ストアドプロシージャ操作 その4

UPDATE:2007/04/20 

<< 前のTips  次のTips >>

 


その3では引数ありのストアドプロシージャのOUTパラメータを受け取る方法を紹介しました。
今回は、REF CURSORをOUT引数として持つストアドプロシージャをC#でDataReaderに受け取る方法を紹介します。

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

ストアドプロシージャは下記の通りです。
(例によって深い意味はありません。説明用です。)

■ストアドプロシージャ4
CREATE OR REPLACE PACKAGE SCOTT.PKG_TEST1
IS
TYPE ref_cursor IS REF CURSOR;
Procedure PROCEDURE4(in_EMPNO IN VARCHAR2, in_ENAME IN VARCHAR2, in_DEPTNO IN NUMBER, out_cursor OUT ref_cursor);
END;
/

CREATE OR REPLACE PACKAGE BODY SCOTT.PKG_TEST1 AS
Procedure PROCEDURE4 (
    in_EMPNO in varchar2,
    in_ENAME in varchar2,
    in_DEPTNO in number,
    out_CURSOR OUT ref_cursor
)
IS
    varSQL varchar2(2000);
BEGIN
    INSERT INTO EMP (EMPNO, ENAME, DEPTNO) VALUES (in_EMPNO, in_ENAME, in_DEPTNO);
    -- open cursor
    varSQL := 'SELECT * FROM EMP WHERE DEPTNO=' || in_DEPTNO;
    OPEN out_CURSOR FOR varSQL;
END PROCEDURE4;
END PKG_TEST1;
/

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

 まず、ストアドプロシージャのIN引数に渡す値の設定を行います。このサンプルでは"in_EMPNO","in_ENAME","in_DEPTNO"の3つです。
 ストアドプロシージャのOUT引数ですが、OleDBでは指定することができません。(指定はできませんが、OUT引数の結果はDataReaderにセットされます)
 あとはDataReaderを作成し、Readメソッドを使用することで、1レコードずつ処理をすることができます。

 
サンプル
using System.Data.OleDb;

private void OleDB_TEST4()
{
    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 = "PKG_TEST1.PROCEDURE4";
                //ストアドプロシージャの引数に渡す値の設定
                Cmd.Parameters.Add("in_EMPNO", OleDbType.VarChar).Value = "7777";
                Cmd.Parameters.Add("in_ENAME", OleDbType.VarChar).Value = "HIRO";
                Cmd.Parameters.Add("in_DEPTNO", OleDbType.Decimal).Value = 20;

                OleDbDataReader OraRead;
                OraRead = Cmd.ExecuteReader();

                listBox1.Items.Clear();
                //データの取り出し
                while (OraRead.Read())
                    listBox1.Items.Add(OraRead.GetString(OraRead.GetOrdinal("ENAME")));

                MessageBox.Show(
                    "PROCEDURE4 正常終了",
                    "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);
    }
}