我正在尝试编写一个调用oracle存储过程的Web服务。该过程有2个输入 - 字符串(company_code)和int(客户代码)。它有2个输出参数;数字(pout_addr_code)和varchar2(pout_descr)。当我从SQL Developer运行此过程时,一切正常,并且两个值都按预期返回。当我从C#Web服务调用该过程时,执行时出现错误“Oracle.DataAccess.Client.OracleException:ORA-06502:PL / SQL:numeric或value error”,而不是在编译期间。
如果我注释掉 cmd.ExecuteNonQuery()和返回pout_addr_code.Value ... 行,它将正常运行并输出我的测试字符串。
如果我从过程中删除varchar2输出并注释掉添加pout_descr参数的部分并注释掉返回“我返回...”它运行正常,包括从中返回值存储过程。
所以在我看来,当程序具有 OracleDbType.Varchar2 行时,问题在于执行 NonQuery 。在使用Oracle.DataAccess引用在C#中添加输出参数时,是否还有其他方法可以定义?我发现this post询问了类似的错误,但他的解决方案是'在C#'中指定VARCHAR2的最大值为32767但我不知道你是怎么做的。
这是我的c#代码:
public string AutoPmtPost(string company_code, int customer_code)
{
string oradb = "Data Source=MySource; User Id=MyID; Password=MyPassword;";
OracleConnection conn = new OracleConnection(oradb);
conn.Open();
OracleCommand cmd = new OracleCommand("USP_JEFF_TEST", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("pin_company_code", OracleDbType.Varchar2, ParameterDirection.Input).Value = company_code;
cmd.Parameters.Add("pin_customer_code", OracleDbType.Int32, ParameterDirection.Input).Value = customer_code;
OracleParameter pout_addr_code = new OracleParameter("pout_addr_code", OracleDbType.Int32);
pout_addr_code.Direction = ParameterDirection.Output;
cmd.Parameters.Add(pout_addr_code);
OracleParameter pout_descr = new OracleParameter("pout_descr", OracleDbType.Varchar2);
pout_descr.Direction = ParameterDirection.Output;
cmd.Parameters.Add(pout_descr);
cmd.ExecuteNonQuery();
//return pout_addr_code.Value.ToString();
return "I returned something";
}
感谢。
答案 0 :(得分:6)
OracleParameter pout_descr = new OracleParameter("pout_descr", OracleDbType.Varchar2);
应该是
OracleParameter pout_descr = new OracleParameter("pout_descr", OracleDbType.Varchar2, 2000);