2013-01-09 15 views
8

SPからデータを取得しようとして重大な問題が発生しています。私はこのようにしようとしていました:.NETのストアドプロシージャから出力パラメータを返す方法

OracleCommand ora_cmd = new OracleCommand("a6r1.PR_ABC_P_ALTA_TARJETA_PAYWARE", ora_conn); 
        ora_cmd.BindByName = true; 
        ora_cmd.CommandType = CommandType.StoredProcedure; 

        int success= new int(); 

        ora_cmd.Parameters.Add("Lc_Param_Issuer", OracleDbType.Varchar2, issuer, ParameterDirection.Input); 
        ora_cmd.Parameters.Add("Ln_Param_Valid_Product", OracleDbType.Varchar2, DropDownListProducto.SelectedValue.ToString(), ParameterDirection.Input); 
        ora_cmd.Parameters.Add("Ln_Param_Total", OracleDbType.Int32, parsed, ParameterDirection.Input); 
        ora_cmd.Parameters.Add("Lc_Param_User", OracleDbType.Varchar2, user, ParameterDirection.Input); 
        ora_cmd.Parameters.Add("Lc_Encrypted_Password", OracleDbType.Varchar2, pass, ParameterDirection.Input); 
        ora_cmd.Parameters.Add("Lc_Exito", OracleDbType.Int32, success, ParameterDirection.Output); 
        ora_cmd.Parameters.Add("Lc_Error", OracleDbType.Varchar2, errorMessage, ParameterDirection.Output); 

しかし、変数sucessまたはerrorMessageには何も返されません。私は間違って何をしていますか?より良い方法がありますか? Oracle上で直接実行するとうまく動作します。

答えて

13

は、それはあなたが、出力パラメータとして既存の変数を使用して壁に頭を打った後ので、それは一つの場所に全体のプロセスを文書化し、私はどこにも見つかっていないこの方法の代わりに

ora_cmd.Parameters.Add("Lc_Exito", OracleDbType.Int32).Direction = ParameterDirection.Output; 

ora_cmd.ExecuteNonQuery(); 

if (ora_cmd.Parameters["Lc_Exito"].value == 0) 
+1

はい、あなたは絶対に正しいです。私はoracleのパラメータがSQLと比べて非常に特殊であるとは思わなかった。あなたよりもずっと。 –

+1

'if(ora_cmd.Parameters [" Lc_Exito "])。value == 0)'に余分な括弧があります。 'if(ora_cmd.Parameters [" Lc_Exito "]。value == 0)'を意味しますか? – stephen

1

を試すことができないようで、ここでは、それを叩いてはOPのコードからの出力パラメータのいずれかを使用して、私が思い付いたの私のバージョンです:

OracleParameter param = new OracleParameter(); 
param = ora_cmd.Parameters.Add("Lc_Exito", OracleDbType.Int32, ParameterDirection.Output); // can assign the direction within the parameter declaration 
param.Size = 25; // failed for me if I did not have this - should be the same as the DB field, if exporting a value from the database 

ora_cmd.ExecuteNonQuery(); 

int myLc_ExitoValue = int.Parse(param.Value); // might not need to parse, and might need a .ToString() on param.Value if you do - I was using strings so not sure about OP's exact case 

その後、ストアドプロシージャがOUTパラメータを受け入れるように設定する必要があり、あなたがしなければなりませんそれに割り当てますE手順:

create or replace procedure PR_ABC_P_ALTA_TARJETA_PAYWARE(Lc_Exito OUT number) 
    as 
    begin 
    Lc_Exito := 123; 
    end; 
/

は明らかにこれは、その他の「アウト」パラメータで送信された他のすべてのパラメータを抜けて - それを単純化したかったです。しかし、これは、C#でのストアドプロシージャの呼び出しの前、中、後、およびストアドプロシージャのOUTパラメータを設定し値を取得する方法をすべて設定する方法を示しています。

+1

コードのインラインコメントが示すように、 "Size"プロパティが文字列出力パラメータにとって非常に重要であることを強調したいと思います。 –

関連する問題