2013-05-09 25 views
0

我很難嘗試在C#中調用我的DBA函數。它在Oracle查詢瀏覽器中工作正常,但是當我嘗試在C#中執行時,它失敗。無法獲取Oracle包函數在c#中執行

最常見的錯誤是: 「ORA-06502:PL/SQL:數字或值錯誤:字符串緩衝區太小 ORA-06512:在第1行」

我已經嘗試增加大小的C#參數,但沒有成功。不知道我做錯了什麼。

C#代碼:

 string returnValue = string.Empty; 
     using (OracleConnection cn = new OracleConnection("ConnectionString")) 

     { 
      using (OracleCommand cmd = new OracleCommand()) 
      { 
       cmd.Connection = cn; 


       cmd.CommandText = "package.function"; 
       cmd.CommandType = CommandType.StoredProcedure; 

       OracleParameter param1 = new OracleParameter(); 
       OracleParameter param2 = new OracleParameter(); 
       OracleParameter param3 = new OracleParameter(); 
       OracleParameter param4 = new OracleParameter(); 
       OracleParameter param5 = new OracleParameter(); 

       param1.OracleDbType = OracleDbType.Varchar2; 
       param1.Direction = ParameterDirection.Input; 
       param1.Value = "Test808"; 
       param1.ParameterName = "var1"; 
       //param1.Size = 2000; 

       param2.OracleDbType = OracleDbType.Varchar2; 
       param2.Direction = ParameterDirection.Input; 
       param2.Value = "68B54814"; 
       param2.ParameterName = "var2"; 
       //param2.Size = 2000; 

       param3.OracleDbType = OracleDbType.Varchar2; 
       param3.Direction = ParameterDirection.Input; 
       param3.Value = "71839"; 
       param3.ParameterName = "var4"; 
       //param3.Size = 2000; 

       param4.OracleDbType = OracleDbType.Varchar2; 
       param4.Direction = ParameterDirection.Input; 
       param4.Value = 55 ; 
       param4.ParameterName = "var4"; 
       //param4.Size = 2000; 

       param5.OracleDbType = OracleDbType.Varchar2; 
       param5.Direction = ParameterDirection.ReturnValue; 
       param5.ParameterName = "return"; 
       //param5.Size = 2000; 



       cmd.Parameters.Add(param1); 
       cmd.Parameters.Add(param2); 
       cmd.Parameters.Add(param3); 
       cmd.Parameters.Add(param4); 
       cmd.Parameters.Add(param5); 


       try 
       { 
        cn.Open(); 

        cmd.ExecuteNonQuery(); 

        returnValue = cmd.Parameters["return"].Value.ToString(); 
       } 
       catch 
       { 

       } 
       finally 
       { 
        cn.Close(); 
       } 

      } 
     } 

     return returnValue; 

函數頭:

FUNCTION create_rec 
     (p_mims_pallet_id varchar2 
     ,p_item_no varchar2 
     ,p_packer_id varchar2 
     ,p_tare_wt varchar2 
    ) 
     return varchar2 

第1次嘗試甲骨文要求。從來沒有與SQL的問題。參數.Size被註釋掉,看起來不會做任何事情。

通過刪除單個參數並創建它們的Parameter.Add方法可以使它工作。

工作代碼:

 string returnValue = string.Empty; 
     using (OracleConnection cn = new OracleConnection("ConString")) 

     { 
      using (OracleCommand cmd = new OracleCommand()) 
      { 
       cmd.Connection = cn; 
       cmd.CommandText = "package.function"; 
       cmd.CommandType = CommandType.StoredProcedure; 


       cmd.Parameters.Add("rv", OracleDbType.Varchar2, 200, "", ParameterDirection.ReturnValue); 
       cmd.Parameters.Add("var1", OracleDbType.Varchar2, 20, "Test808", ParameterDirection.Input); 
       cmd.Parameters.Add("var2", OracleDbType.Varchar2, 20, "68B54814", ParameterDirection.Input); 
       cmd.Parameters.Add("var3", OracleDbType.Varchar2, 20, "71839", ParameterDirection.Input); 
       cmd.Parameters.Add("var4", OracleDbType.Decimal, 55, ParameterDirection.Input); 

       try 
       { 
        cn.Open(); 

        cmd.ExecuteNonQuery(); 

        returnValue = cmd.Parameters["rv"].Value.ToString(); 
       } 
       catch 
       { 

       } 
       finally 
       { 
        cn.Close(); 
       } 

      } 
     } 

     return returnValue; 
+1

檢查您嘗試插入/更新的字段的varchar2大小,並與您傳遞的值進行比較。 – cableload 2013-05-09 18:07:31

+1

我很肯定你必須給C#參數名稱與Oracle名稱相同的名稱,所以不用像'param1.ParameterName =「var1」;'try'param1.ParameterName =「p_mims_pallet_id」;'等等上。這並不能解釋你報告的錯誤,但你提到你有其他人。至於參數'Size',我只是確保它至少足夠大,以便我傳遞的值;更大也應該罰款。 – 2013-05-09 18:10:47

+0

我檢查過表格結構,所有的東西都檢查出來。我相信這是C#代碼。如果它在從SQL瀏覽器調用時在Oracles結束時正常工作,那麼我必須做出錯誤的事情。只是看不到它。將所有參數名稱更改爲其受尊重的標題名稱,並仍然出現相同的錯誤。還將.Size更改爲2000,並引發相同的錯誤。 – 2013-05-09 18:30:55

回答

1

我通過改變它的語法修復了這個問題。這是給數字或值溢出錯誤,如果我們使用下面的語法:

cmd.Parameters.Add("strSqlMsg", OracleDbType.Varchar2, 255, ParameterDirection.Output); 

其中我變爲下面,它的工作。

cmd.Parameters.Add("strSqlMsg", OracleDbType.Varchar2, ParameterDirection.Output).Size=255; 

希望這會對你有用。 謝謝。 Atul

0
string strRetrun = string.Empty; 
using (OracleConnection objCon = (OracleConnection)_connection) 
     { 
      using (OracleCommand objCom = new OracleCommand()) 
      { 
       objCom.Connection = objCon; 
       objCom.CommandText = "SAM.PKG_SAM_ECH.F_FUND_TRANSFER_TYPE"; 
       objCom.CommandType = CommandType.StoredProcedure; 

       OracleParameter codeReturn = new OracleParameter("RETURN", OracleType.VarChar, 1000); 
       codeReturn.Direction = ParameterDirection.ReturnValue; 


       OracleParameter code1 = new OracleParameter("V_RECORD_ID", OracleType.Number); 
       code1.Direction = ParameterDirection.Input; 
       if (obj.RecordId != null) 
        code1.Value = obj.RecordId; 
       else 
        code1.Value = DBNull.Value; 


       OracleParameter code2 = new OracleParameter("V_DEBIT_APAC", OracleType.VarChar, 200); 
       code2.Direction = ParameterDirection.Input; 
       if (obj.P_BENEF_APAC != null) 
        code2.Value = obj.P_BENEF_APAC; 
       else 
        code2.Value = DBNull.Value; 


       OracleParameter code3 = new OracleParameter("V_ACCOUNT_TYPE", OracleType.VarChar, 200); 
       code3.Direction = ParameterDirection.Input; 
       if (obj.BenfAccType != null) 
        code3.Value = obj.BenfAccType; 
       else 
        code3.Value = DBNull.Value; 

       OracleParameter code4 = new OracleParameter("V_IFSC_CODE", OracleType.VarChar, 200); 
       code4.Direction = ParameterDirection.Input; 
       if (obj.IFSC != null) 
        code4.Value = obj.IFSC; 
       else 
        code4.Value = DBNull.Value; 


       objCom.Parameters.Add(codeReturn); 
       objCom.Parameters.Add(code1); 
       objCom.Parameters.Add(code2); 
       objCom.Parameters.Add(code3); 
       objCom.Parameters.Add(code4); 

       try 
       { 
        objCon.Open(); 

        objCom.ExecuteNonQuery(); 

        strRetrun = objCom.Parameters["RETURN"].Value.ToString(); 
       } 
       catch 
       { 

       } 
       finally 
       { 
        objCon.Close(); 
       } 

      } 
     } 


     return strRetrun;