【问题标题】:oracle character to number conversion error from .net来自.net的oracle字符到数字转换错误
【发布时间】:2020-05-09 10:00:27
【问题描述】:

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

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

如果我直接从 oracle sql developer 运行程序,它工作正常。

代码:-

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;

【问题讨论】:

  • “逻辑来到这里”可能是负责任的。似乎您在某处对包含除数字以外的其他内容的字符串执行 TO_NUMBER ;例如,TO_NUMBER('12F') 将失败。
  • 如果你注释掉所有--logic comes here但分配po_msg := "Some Test Message";,你还有问题吗?
  • @Littlefoot 我明白了,但我通过了数字字段但它失败了。我没有给出这样的转换。
  • @DmitryBychenko 我没有编辑程序的权限。所以我无法检查。
  • 尝试将 OracleDbType.Int32 切换到 OracleDbType.Decimal - Oracle 将不带精度的数字映射到 .NET 十进制而不是整数 - 另外您应该调用 ExecuteNonQuery...

标签: c# asp.net oracle


【解决方案1】:

每当您有一个带有一个 OUT 参数的过程时,我宁愿创建一个函数。

无论如何,看起来你无法改变这一点,所以拿走你所拥有的。

尝试像这样添加参数:

cmd.Parameters.Add("PO_MSG", OracleDbType.Varchar2, 4000, null, ParameterDirection.Output); cmd.Parameters["PO_MSG"].DbType = DbType.String;

(仅与旧版本的 ODP.NET 提供程序相关)

cmd.ExecuteScalar(); 似乎是错误的。见documentation

此方法使用连接执行查询,并返回 查询返回的结果集中第一行的第一列。

您不执行查询,而是要调用过程。使用cmd.ExecuteNonQuery();

但真正的问题应该是输出参数的大小。显然 4000 个字符是不够的。与 SQL(除非您设置 MAX_STRING_SIZE = EXTENDED)相反,最大值。 VARCHAR2 数据类型的大小为 32767,参见 PL/SQL Program Limits

所以,把你的参数改成

cmd.Parameters.Add("PO_MSG", OracleDbType.Varchar2, 32767).Direction = ParameterDirection.Output;

【讨论】:

  • 不走运。我认为,就我而言,输出对于这个问题并不重要
  • 那么错误似乎在程序内部。尝试从 sqlplus 窗口手动执行它,看看是否得到相同的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2017-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多