5

我有一个接收SearchCriteria对象集合的函数:columnName 或 Key、运算符(、、、<<=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:在需要数字的地方发现了一个非数字字符”}

4

1 回答 1

6

答案很简单:在您的命令中,构建以下字符串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
于 2013-08-23T21:48:07.463 回答