我有一个函数接收 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 <= ### 我在两个日期之间查找。我不能两次使用相同的参数名称,因此我在遍历所有 SearchCriteria 对象时使用 i++ 计数器作为参数名称。我知道看到这样命名的参数很奇怪,但它在大多数情况下都有效。
如果我把它放入我的查询窗口,检查参数值并将其插入:
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: a non-numeric character was found where a numeric was expected"}
最佳答案
答案很简单:
在您的命令中,构建以下字符串 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
关于c# - ORA-01858 : a non-numeric character was found where a numeric was expected,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17091774/