C# .net中的oracle字符到数字转换错误

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();

我在oracle中有一个过程,输入字段为varchar2和number。我正在使用Oracle.DataAccess.dll从.Net代码中添加参数。我有一个例外,比如

ORA-06502:PL/SQL:数字或值错误:字符到数字转换错误\nORA-06512:第1行

若我直接从OracleSQLDeveloper运行该过程,那个么它可以正常工作

代码:-

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窗口手动执行它,看看是否会出现相同的错误。