2013-01-09 32 views
8

我遇到了严重问题,试图从SP获取数据。我试图这样做:如何从.NET中的存储过程返回oracle输出参数

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); 

但它没有返回任何东西到变量成功或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; 
/

很显然,这会遗漏所有其他正在发送的参数以及其他“out”参数 - 希望简化它。但是这显示了在调用C#中的存储过程之前,之中和之后,如何设置所有内容以及如何设置存储过程的OUT参数并获取值。

+1

我想强调的是,“Size”属性对于字符串输出参数非常重要,因为代码中的内联注释表明。 –

相关问题