我有一个函数,它接收SearchCriteria
个对象的集合:
columnName或Key,运算符(<
,<=
,like
等)和值。
该函数构建一个命令对象。 我将值设为命令参数,现在我的单元测试不适用于日期。 但是我的所有单元测试都适用于所有其他数据类型,如varchar。
在调试器中,我的一个日期单元测试结果失败,最终看起来像这样:
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
我确实有一个名为like:letter_date的参数。但我可能有:letter_date&gt; = ###&amp;&amp; :letter_date&lt; = ###我在两个日期之间寻找。我不能两次使用相同的参数名称,因此当我循环遍历所有的SearchCriteria对象时,我使用i ++计数器作为参数名称。奇怪的是看到一个名为这样的参数我知道,但它大部分都在工作。
如果我接受并放入我的查询窗口,并查看param值并将其插入:
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:找到了数字所在的非数字字符”}
答案 0 :(得分:5)
答案很简单:
在您的命令中,构建以下字符串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