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

时间:2013-06-13 16:02:41

标签: c# .net oracle

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

1 个答案:

答案 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