【发布时间】:2013-08-24 05:48:07
【问题描述】:
我有一个接收SearchCriteria 对象集合的函数:
列名或键、运算符(<、<=、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
如果我把它放到我的查询窗口中,然后检查参数值并将其插入:
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: 在需要数字的地方发现了一个非数字字符"}
【问题讨论】:
-
在你的C#代码中,日期参数的数据类型是什么?如果是字符串,它的格式如何——
yyyy-mm-dd、mm/dd/yyyy等? -
嗯,它不是真正的日期参数。这是非常通用的。大多数情况下,这是一个 varchar 参数。但是我提前检查它是否是日期字段,如果是,我将值传递给 parseDate 函数。我可以采用 4 种日期格式,但我总是以与我的掩码匹配的格式返回它:yyyy-mm-dd。
-
所以在上面的例子中,我插入的是'2013-1-21。上面的 SQL 已经工作了很长时间。直到我把它作为一个命令参数它才停止工作。另外,就像我上面说的,我可以将它插入到我的查询窗口中,它可以正常执行。 ODP.Net 不应该关心我是否正在处理约会。我所做的就是将整个 TO_DATE('2013-1-21', 'yyyy-mm-dd') 插入到 :1 参数占位符中。
-
如果您将参数值设置为
myString,请尝试将其设置为DateTime.ParseExact(yourString, 'yyyy-MM-dd', null),如果这适合您现有的框架。这样,它将被视为日期,格式上不应该有任何混淆。 -
抱歉,Ed,我不太明白你的意思。我确实调用了这样的函数来解析日期: if (columnDataType.ToUpper() == "DATE") { value = ParseDateFromValue(value); }