【发布时间】:2015-07-30 13:39:09
【问题描述】:
我正在尝试制作一个在 SQL Server 上执行一些查询的程序,由于某种原因,代码有奇怪的行为,因为它会在我的两台计算机上创建不同的日期值。
这是代码行为怪异的部分。
Query += " dbo.MensajesProcesados.SentDateTime BETWEEN CONVERT(VARCHAR, '" + FechaInicio.Value.ToUniversalTime().ToShortDateString() + "', 103) AND CONVERT(VARCHAR, '" + FechaFin.Value.ToUniversalTime().ToShortDateString() + "', 103)";
在第一台计算机(工作)给我:
BETWEEN CONVERT(VARCHAR, '5/18/2015', 103) AND CONVERT(VARCHAR, '5/19/2015', 103)
以及第二台不工作的计算机:
BETWEEN CONVERT(VARCHAR, '17/05/2015',103) AND CONVERT(VARCHAR, '19/05/2015',103)
这个不工作,会输出以下错误
将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。
拜托,任何帮助都会很棒!
【问题讨论】:
-
如果你停止连接你的 SQL 而是使用参数,这些问题就不会存在。而且,作为一项额外功能,您的代码不会对 SQL 注入开放。
-
您在问题中显示了 2 种不同的日期格式,但您没有向转换器指定要使用的格式(在提供的示例代码中)。转换函数应该如何知道第一个数字是代表日期时间的月份还是日期?您可以更改转换器使用的格式,或日期时间使用的格式(用于字符串输出),但正确的解决方案是使用参数正确执行 SQL。 SQL 库非常有用,它提供的不仅仅是执行字符串 SQL 语句的简单方法。
-
@KenWhite 问题是如果我不使用连接,我不知道另一种方法来做我需要的事情,因为我有各种搜索参数,如果文本框里面有东西,它会在 where 子句中使用它,否则它不会,你怎么能用 params 来实现呢?
-
您可以根据需要使用
SQLCommand.Parameters.AddWithValue创建参数。请参阅这些search results,其中应该会出现一些这样做的示例。
标签: c# sql sql-server