20

SPからデータを取り戻そうとして深刻な問題が発生しています。私はこのようにそれをやろうとしていました:

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で直接実行すると正常に動作します。

4

2 に答える 2

21

既存の変数を出力パラメータとして使用できないようです。代わりにこの方法を試してください

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

ora_cmd.ExecuteNonQuery();

if (ora_cmd.Parameters["Lc_Exito"].value == 0)
于 2013-01-09T23:22:35.800 に答える
6

プロセス全体を 1 か所で文書化している場所が見つからないため、頭を壁にぶつけて打ちのめした後、OP のコードからの出力パラメーターの 1 つを使用して、思いついたバージョンを次に示します。

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あり、プロシージャーでそれに割り当てる必要があります。

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

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

于 2016-10-03T18:00:28.870 に答える