我很難嘗試在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;
檢查您嘗試插入/更新的字段的varchar2大小,並與您傳遞的值進行比較。 – cableload 2013-05-09 18:07:31
我很肯定你必須給C#參數名稱與Oracle名稱相同的名稱,所以不用像'param1.ParameterName =「var1」;'try'param1.ParameterName =「p_mims_pallet_id」;'等等上。這並不能解釋你報告的錯誤,但你提到你有其他人。至於參數'Size',我只是確保它至少足夠大,以便我傳遞的值;更大也應該罰款。 – 2013-05-09 18:10:47
我檢查過表格結構,所有的東西都檢查出來。我相信這是C#代碼。如果它在從SQL瀏覽器調用時在Oracles結束時正常工作,那麼我必須做出錯誤的事情。只是看不到它。將所有參數名稱更改爲其受尊重的標題名稱,並仍然出現相同的錯誤。還將.Size更改爲2000,並引發相同的錯誤。 – 2013-05-09 18:30:55