我有一个函数,它的集合SearchCriteria对象:列名或关键,运营商(<,<=,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
Run Code Online (Sandbox Code Playgroud)
我确实有一个名为like:letter_date的参数.但我可能有:letter_date> = ### &&:letter_date <= ###我在两个日期之间寻找.我不能两次使用相同的参数名称,因此当我循环遍历所有的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
Run Code Online (Sandbox Code Playgroud)
它工作正常.但它不能从我的单元测试的C#代码中工作.同样适用于所有其他数据类型.并且它在我参数化select语句中的值之前使用.
确切的错误是:
{"ORA-01858:找到了数字所在的非数字字符"}
这里的答案非常简单:在您的命令中,构建以下字符串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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23844 次 |
| 最近记录: |