我有一个针对SQL Server数据库运行的简单测试查询。
SELECT IsDate('1' + '/' + '25' + '/' + '1993')
当我使用
对数据库运行时set dateformat dmy
它正确返回0
当我使用
对数据库运行时set dateformat mdy
它正确返回1
现在的问题是,当我从.Net中的SqlCommand
对象运行此查询时,我得不到我期望的结果。
问题在于我将我的线程的文化信息和日期时间格式设置为d / m / y。即使我的线程以d / m / y格式运行并且我的数据库设置为d / m / y,当从SqlCommand
运行时,我仍然从查询中返回1。
示例代码:(注意:QuickQuery
只是一个对我所选数据库运行SqlCommand
的包装器方法)
string query = $" SELECT IsDate('1' + '/' + '25' + '/' + '1993')";
var dt = QuickQuery(query);
return $"{dt.Rows[0][0]}" + $" {new DateTime(1993, 1, 25)}";
此输出=" 1 25/01/1993 00:00:00"
当我的实际数据库和当前线程设置为d / m / y时,确定SqlCommand
在m / d / y的上下文中运行是什么?
我已使用
确认了我的数据库设置DBCC USEROPTIONS
修改1:
只是一个简单的说明 - 我很欣赏关于做事更好的方式的投入,这很有价值。对于这个特殊情况,我不能悲伤地选择问题的背景,我只是去解决它。我为每个值月,日和年都有一个varchar
列。它们可以为null或文本。由此我必须创建与实际datetime
列的日期时间比较,并能够在服务器和正在运行的线程上使用任何日期时间格式!
答案 0 :(得分:0)
基本上:完全避免问题。永远不要把日期称为字符串。使用明确定义和输入的参数。
基本上(切换到Dapper syntax,因为它支持参数):
DateTime date = ...
var dt = connection.QuerySingle<DateTime>("select @date + 2", new {date});
其他数据也是如此 - 你会遇到与数字,小数分隔符和组分隔符类似的问题,以及正确的方法 来了解SQL Server想要的格式:它是不使用字符串,但传递参数化值。它还会使意外陷入SQL注入漏洞变得更加困难。