ORA-01858:找到了一个非数字字符,其中包含数字

Sam*_*Sam 5 .net c# oracle

我有一个函数,它的集合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:找到了数字所在的非数字字符"}

T.S*_*.S. 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
Run Code Online (Sandbox Code Playgroud)