2013-01-09 85 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」屬性對於字符串輸出參數非常重要,因爲代碼中的內聯註釋表明。 –

相關問題