C# 无法获取要在c中执行的Oracle包函数#
我很难在C#中调用我的DBA函数。它在Oracle查询浏览器中运行良好,但是当我尝试在C#中执行它时,它失败了 最常见的错误是:“ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小 ORA-06512:第1行“ 我试图增加C#参数的大小,但没有成功。不知道我做错了什么 C#代码: 函数标题:C# 无法获取要在c中执行的Oracle包函数#,c#,oracle,C#,Oracle,我很难在C#中调用我的DBA函数。它在Oracle查询浏览器中运行良好,但是当我尝试在C#中执行它时,它失败了 最常见的错误是:“ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小 ORA-06512:第1行“ 我试图增加C#参数的大小,但没有成功。不知道我做错了什么 C#代码: 函数标题: FUNCTION create_rec (p_mims_pallet_id varchar2 ,p_item_no varchar2 ,p_pack
FUNCTION create_rec
(p_mims_pallet_id varchar2
,p_item_no varchar2
,p_packer_id varchar2
,p_tare_wt varchar2
)
return varchar2
第一次尝试Oracle呼叫。从来没有SQL问题。参数.Size被注释掉,因为它似乎不做任何事情
通过删除单个参数并创建参数,可以使其正常工作。添加方法
工作代码:
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;
我通过修改语法解决了这个问题。如果我们使用以下语法,则会出现数字或值溢出错误:
cmd.Parameters.Add("strSqlMsg", OracleDbType.Varchar2, 255, ParameterDirection.Output);
我把它改成了下面的,它起作用了
cmd.Parameters.Add("strSqlMsg", OracleDbType.Varchar2, ParameterDirection.Output).Size=255;
希望这对你有用。
谢谢
Atul致所有想知道为什么Tim B的答案有效的人。 这是参数的顺序! 必须首先绑定函数的返回参数! 对于其他参数,顺序计数,而不是名称 如果将“param5”作为集合中的第一个对象添加,则单独创建参数的第一个版本就可以了
我在这一点上陷入了困境:-(检查您试图插入/更新的字段的varchar2大小,并与您正在传递的值进行比较。我非常确定您必须为C参数名称指定与Oracle名称相同的名称,因此,而不是例如
param1.ParameterName=“var1”;
尝试param1.ParameterName=“p\u mims\u托盘\u id”
等等。这并不能解释你报告的错误,但你提到了其他错误。至于参数大小
,我只是确保它至少足够大,可以容纳我传递的值;更大也可以。我检查了表结构,所有内容都检查出来了。我相信它至少与C代码有关s点。如果从SQL浏览器调用Oracles end时,它在Oracles end上工作正常,那么我一定是做错了什么。只是看不到它。将所有参数名称更改为其受尊重的头名称,但仍然得到相同的错误。还将.Size更改为2000,并引发相同的错误。您已将param4的类型设置为Varchar2,但分配了一个整数r值。不确定这是否会导致您的错误,但修复它也无妨。
cmd.Parameters.Add("strSqlMsg", OracleDbType.Varchar2, ParameterDirection.Output).Size=255;
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;