当ADO.Net运行查询时,什么决定数据库的日期时间格式?

时间:2017-04-06 14:34:24

标签: c# sql-server datetime

我有一个针对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列的日期时间比较,并能够在服务器和正在运行的线程上使用任何日期时间格式!

1 个答案:

答案 0 :(得分:0)

基本上:完全避免问题。永远不要把日期称为字符串。使用明确定义和输入的参数。

基本上(切换到Dapper syntax,因为它支持参数):

 DateTime date = ...
 var dt = connection.QuerySingle<DateTime>("select @date + 2", new {date});

其他数据也是如此 - 你会遇到与数字,小数分隔符和组分隔符类似的问题,以及正确的方法 来了解SQL Server想要的格式:它是不使用字符串,但传递参数化值。它还会使意外陷入SQL注入漏洞变得更加困难。