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で直接実行すると正常に機能します。
既存の変数を出力パラメーターとして使用できないようです。代わりにこの方法を試してください
ora_cmd.Parameters.Add("Lc_Exito", OracleDbType.Int32).Direction = ParameterDirection.Output;
ora_cmd.ExecuteNonQuery();
if (ora_cmd.Parameters["Lc_Exito"].value == 0)
プロセス全体を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
パラメータを設定して値を取得する方法を示しています。