2017-01-19 14 views
0

C#コードから、OracleからPACKAGE.PROCEDURE()をコールしようとしています。この単純な例では、私は、プロシージャ・コールから一つの値を取得する必要がありますが、私が得るすべてのエラーです:C#コードからOracleプロシージャを呼び出す方法

wrong number or types of arguments in call to 'RETURN_NUM'

次のように手順が宣言されています。

PROCEDURE return_num(xNum OUT NUMBER) AS 
    BEGIN 
    xNum:= 50; 
    dbms_output.put_line('hello world ' || xNum); 
    END; 

C#コード:

Oraclecon.Open(); 
        OleDbCommand myCMD = new   OleDbCommand("TEST.return_num", Oraclecon); 
        myCMD.CommandType = CommandType.StoredProcedure; 
        myCMD.Parameters.Add("xNum", OleDbType.Numeric); 

        OleDbDataReader myReader; 
        myReader = myCMD.ExecuteReader(); 

私が間違っていることを指摘できる人もいます。私はそれに近づくことができますどのように

TYPE r_interface_data IS RECORD 
    (
    object_id    VARCHAR2(16),  
    obj_type    VARCHAR2(32) 
    ); 

    TYPE t_interfase_data IS TABLE OF r_interface_data; 

:次に、実際のシナリオでは、私のような、カスタムタイプから値のセットを返すプロシージャを呼び出すしたいと思います。ありがとう!

UPDATE:私の特定のケースでは、私が終わったアップ私はあなたがそこまでオフだとは思わない、次のアプローチ

using (OleDbCommand cmd = new OleDbCommand("PACKAGE.procedure_name")) 
       { 
        cmd.CommandType = CommandType.StoredProcedure; 

        SqlManager sqlManager = new SqlManager(); 
        return sqlManager.GetDataSet(cmd); 
       } 
+0

更新: したがって、パラメータの方向をOUT(下のビューコード)に指定すると、自分のコードがコンパイルされます。私はデータを受け取っていません... 'myCMD.Parameters.Add(" xNum "、OleDbType.Numeric).Direction = ParameterDirection.Output; ' アイデアはありますか? –

答えて

2

をやって...これを試してみてください。

OracleCommand cmd = new OracleCommand("return_num", Oraclecon); 
cmd.Parameters.Add(new OracleParameter("xNum", OracleDbType.Decimal, 
    ParameterDirection.Output)); 
cmd.CommandType = CommandType.StoredProcedure; 

cmd.ExecuteNonQuery(); 
OracleDecimal d = (OracleDecimal)cmd.Parameters[0].Value; 
double result = d.ToDouble(); 

resultプロシージャのoutパラメータが含まれています。

あなたの問題は、ストアドプロシージャでDbDataReaderを使用しようとしていたことだと思います。 DbDataReaderはクエリ用です。

また、私はODP.netを使用しました。これはあなたの問題に貢献しているかどうか、あなたがOleを使っていたかどうかです。

+0

あなたのお返事ありがとうございます@Hambone。私の特別なケースでは、私は次のアプローチを使用して終了しました...更新を参照してください –

関連する問題