C# .net中的oracle字符到数字转换错误
我在oracle中有一个过程,输入字段为varchar2和number。我正在使用Oracle.DataAccess.dll从.Net代码中添加参数。我有一个例外,比如 ORA-06502:PL/SQL:数字或值错误:字符到数字转换错误\nORA-06512:第1行 若我直接从OracleSQLDeveloper运行该过程,那个么它可以正常工作 代码:-C# .net中的oracle字符到数字转换错误,c#,asp.net,oracle,C#,Asp.net,Oracle,我在oracle中有一个过程,输入字段为varchar2和number。我正在使用Oracle.DataAccess.dll从.Net代码中添加参数。我有一个例外,比如 ORA-06502:PL/SQL:数字或值错误:字符到数字转换错误\nORA-06512:第1行 若我直接从OracleSQLDeveloper运行该过程,那个么它可以正常工作 代码:- OracleCommand cmd = (OracleCommand)_dbFactory.CreateCommand();
OracleCommand cmd = (OracleCommand)_dbFactory.CreateCommand();
try
{
cmd.Connection = (OracleConnection)_conOracle;
_conOracle.Open();
cmd.CommandText = "SERVICE_STATUS";
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.Clear();
cmd.Parameters.Add("PANUMBER", OracleDbType.Int32).Value = 10;
cmd.Parameters.Add("PA_LINK", OracleDbType.Varchar2).Value = "Test";
cmd.Parameters.Add("PO_MSG", OracleDbType.Varchar2, 4000).Direction = System.Data.ParameterDirection.Output;
try
{
cmd.ExecuteScalar();
}
catch(Exception ex1) {
log.Debug("Exception ex1 "+ ex1.Message+" inner--"+ex1.InnerException);
}
string isValid = cmd.Parameters["PO_MSG"].Value.ToString();
if (isValid == "SUCCESS")
return true;
else
return false;
}
catch (Exception ex)
{
throw ex;
}
finally
{
_conOracle.Close();
}
程序
create or replace
PROCEDURE SERVICE_STATUS( panumber number, pa_link varchar2 default NULL, po_msg OUT VARCHAR2 )
is
BEGIN
--logic comes here
END;
每当您有一个带有一个OUT参数的过程时,我宁愿创建一个函数 不管怎样,看起来你无法改变,所以拿着你所有的 尝试添加如下参数:
cmd.Parameters.Add(“PO_MSG”,OracleDbType.Varchar2,4000,null,ParameterDirection.Output)代码>
cmd.Parameters[“PO_MSG”].DbType=DbType.String代码>
(仅与旧版本的ODP.NET提供程序相关)
cmd.ExecuteScalar()代码>似乎是错的。见:
此方法使用连接执行查询,并返回
查询返回的结果集中第一行的第一列
您不执行查询,而是要调用一个过程。使用cmd.ExecuteNonQuery()代码>
但真正的问题应该是输出参数的大小。显然,4000个字符是不够的。与SQL相反(除非您设置了MAX\u STRING\u SIZE=EXTENDED
),VARCHAR2
数据类型的最大大小为32767,请参阅
因此,将参数更改为
cmd.Parameters.Add("PO_MSG", OracleDbType.Varchar2, 32767).Direction = ParameterDirection.Output;
“逻辑来了”可能是原因。似乎你在某个地方对一个字符串上的数字做了修改,这个字符串中除了数字以外还包含其他内容;例如,TO_NUMBER('12F')将失败。如果您注释掉所有的——逻辑在此出现,但分配po_msg:=“一些测试消息”,是否仍有问题代码>?@Littlefoot我理解,但我通过了数字字段,但失败了。我没有这样的转换。@DmitryBychenko我没有编辑程序的权限。所以我无法检查。请尝试将OracleDbType.Int32
切换到OracleDbType.Decimal
-Oracle将一个无精度的数字映射到.NET十进制而不是整数-您也应该调用ExecuteNonQuery
…运气不好。我认为,在我的情况下,输出与此问题无关,因为错误似乎在过程内部。尝试从sqlplus窗口手动执行它,看看是否会出现相同的错误。