【问题标题】:ORA-01858: a non-numeric character was found where a numeric was expectedORA-01858: 在需要数字的地方发现了一个非数字字符
【发布时间】:2013-08-24 05:48:07
【问题描述】:

我有一个接收SearchCriteria 对象集合的函数: 列名或键、运算符(<<=like 等)和值。

该函数建立一个命令对象。 我将该值设为命令参数,现在我的单元测试不适用于日期。 但我所有的单元测试都适用于所有其他数据类型,如 varchar。

在调试器中,我的一个失败的日期单元测试以 cmd 结束,如下所示:

SELECT * FROM (SELECT DocumentId 
               FROM idx1_AuthLetters a 
               INNER JOIN Documents b ON a.DocumentId = b.Id
               WHERE Status in ('L','S','V')  AND  letter_date <= :1 
               ORDER BY DOCUMENTID ) 
WHERE RowNum <= 14 

我确实有一个名为 :letter_date 的参数。但我可能有 :letter_date >= ### && :letter_date

如果我把它放到我的查询窗口中,然后检查参数值并将其插入:

SELECT * FROM (SELECT DocumentId 
               FROM idx1_AuthLetters a 
               INNER JOIN Documents b ON a.DocumentId = b.Id 
               WHERE Status in ('L','S','V')  AND  
                     letter_date <= TO_DATE('2013-1-21', 'yyyy-mm-dd') 
               ORDER BY DOCUMENTID ) 
WHERE RowNum <= 14 

它工作正常。 但它不适用于我的单元测试中的 C# 代码。 这同样适用于所有其他数据类型。 在我对 select 语句中的值进行参数化之前,它可以正常工作。

确切的错误是:

{"ORA-01858: 在需要数字的地方发现了一个非数字字符"}

【问题讨论】:

  • 在你的C#代码中,日期参数的数据类型是什么?如果是字符串,它的格式如何——yyyy-mm-ddmm/dd/yyyy等?
  • 嗯,它不是真正的日期参数。这是非常通用的。大多数情况下,这是一个 varchar 参数。但是我提前检查它是否是日期字段,如果是,我将值传递给 parseDate 函数。我可以采用 4 种日期格式,但我总是以与我的掩码匹配的格式返回它:yyyy-mm-dd。
  • 所以在上面的例子中,我插入的是'2013-1-21。上面的 SQL 已经工作了很长时间。直到我把它作为一个命令参数它才停止工作。另外,就像我上面说的,我可以将它插入到我的查询窗口中,它可以正常执行。 ODP.Net 不应该关心我是否正在处理约会。我所做的就是将整个 TO_DATE('2013-1-21', 'yyyy-mm-dd') 插入到 :1 参数占位符中。
  • 如果您将参数值设置为myString,请尝试将其设置为DateTime.ParseExact(yourString, 'yyyy-MM-dd', null),如果这适合您现有的框架。这样,它将被视为日期,格式上不应该有任何混淆。
  • 抱歉,Ed,我不太明白你的意思。我确实调用了这样的函数来解析日期: if (columnDataType.ToUpper() == "DATE") { value = ParseDateFromValue(value); }

标签: c# .net oracle


【解决方案1】:

这里的答案很简单: 在您的命令中,构建以下字符串 TO_DATE(:1, 'yyyy-mm-dd') 。然后,只需确保进入:1 的字符串格式正确即可。

你的命令文本应该是这样的:

SELECT * FROM (SELECT DocumentId 
           FROM idx1_AuthLetters a 
           INNER JOIN Documents b ON a.DocumentId = b.Id
           WHERE Status in ('L','S','V')  AND  letter_date <= TO_DATE(:1, 'yyyy-mm-dd')  
           ORDER BY DOCUMENTID ) 
WHERE RowNum <= 14

【讨论】:

  • @RichBianco 我认为,我的回答涵盖了这一点。您的输入与您的Format Model 不匹配。其他一切 - 对一般知识感兴趣但对生成修复不那么重要的细节。 :-) 自引用:"...确保进入 :1 的字符串具有准确的格式。" 即与输入匹配的格式模型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-03
  • 2023-03-25
  • 1970-01-01
相关资源
最近更新 更多