Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当ADO.Net运行查询时,是什么规定了数据库的日期时间格式?_C#_Sql Server_Datetime - Fatal编程技术网

C# 当ADO.Net运行查询时,是什么规定了数据库的日期时间格式?

C# 当ADO.Net运行查询时,是什么规定了数据库的日期时间格式?,c#,sql-server,datetime,C#,Sql Server,Datetime,我对SQLServer数据库运行了一个简单的测试查询 SELECT IsDate('1' + '/' + '25' + '/' + '1993') 当我用 set dateformat dmy set dateformat mdy 它正确地返回0 当我用 set dateformat dmy set dateformat mdy 它正确地返回1 现在的问题是,当我从.Net中的SqlCommand对象运行此查询时,我没有得到预期的结果 问题是我正在将我的线程的区域性信息和日期时间格式设

我对SQLServer数据库运行了一个简单的测试查询

SELECT IsDate('1' + '/' + '25' + '/' + '1993')
当我用

set dateformat dmy
set dateformat mdy
它正确地返回0

当我用

set dateformat dmy
set dateformat mdy
它正确地返回1

现在的问题是,当我从.Net中的
SqlCommand
对象运行此查询时,我没有得到预期的结果

问题是我正在将我的线程的区域性信息和日期时间格式设置为d/m/y。即使我的线程以d/m/y格式运行,并且我的数据库设置为d/m/y,当从
SqlCommand
运行时,我的查询仍然返回1

示例代码:(注意:
QuickQuery
只是一个包装方法,它对我选择的数据库运行
SqlCommand

本文件的输出=“1 25/01/1993 00:00:00”

当我的实际数据库和当前线程设置为d/m/y时,是什么决定了
SqlCommand
在m/d/y上下文中运行

我已使用确认我的数据库设置

DBCC USEROPTIONS
编辑1:


只是一个简短的说明-我很感谢大家对如何更好地做事的意见,这是很有价值的。对于这个特殊的案例,我没有选择问题的背景,遗憾的是,我只是想解决它。对于每个月、日和年的值,我都有一个
varchar
列。它们可以为空,也可以为文本。因此,我必须创建与实际
datetime
列的日期时间比较,以便能够在服务器和运行线程上使用任何日期时间格式

本质上:完全避免问题。永远不要把日期当作字符串。使用定义和类型良好的参数

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

DateTime日期=。。。
var dt=connection.QuerySingle(“选择@date+2”,新建{date});

其他数据也是如此—数字、十进制分隔符和组分隔符也会出现类似的问题,正确的方法不是学习SQL Server想要的格式:不是使用字符串,而是传递参数化值。这也会使意外陷入SQL注入漏洞变得更加困难。

本质上:完全避免问题。永远不要把日期当作字符串。使用定义和类型良好的参数

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

DateTime日期=。。。
var dt=connection.QuerySingle(“选择@date+2”,新建{date});


其他数据也是如此—数字、十进制分隔符和组分隔符也会出现类似的问题,正确的方法不是学习SQL Server想要的格式:不是使用字符串,而是传递参数化值。这也会使意外陷入SQL注入漏洞变得更加困难。

查看文档,似乎
set dateformat
适用于当前会话。理想情况下,只需确保您根本不依赖日期格式-如果您总是使用参数化SQL,而使用
DateTime
值,这应该不是问题。您应该向查询中添加一个使用DataTime参数而不是字符串(VarChar)的参数。@JonSkeet感谢文档信息。我正在阅读,没有看到任何这样的评论!您找到了哪些官方文档,以便我了解这些详细信息?我按照底部的链接找到了“Transact-SQL编程语言提供了几个SET语句,这些语句可以更改当前会话对特定信息的处理。”@JonSkeet您的评论是本例的正确答案。当我将SET命令添加到SqlCommand时,我得到了预期的输出。查看文档,它看起来像
SET dateformat
应用于当前会话。理想情况下,只需确保您根本不依赖日期格式-如果您总是使用参数化SQL,而使用
DateTime
值,这应该不是问题。您应该向查询中添加一个使用DataTime参数而不是字符串(VarChar)的参数。@JonSkeet感谢文档信息。我正在阅读,没有看到任何这样的评论!您找到了哪些官方文档,以便我了解这些详细信息?我按照底部的链接找到了“Transact-SQL编程语言提供了几个SET语句,这些语句可以更改当前会话对特定信息的处理。”@JonSkeet您的评论是本例的正确答案。当我将SET命令添加到SqlCommand中时,我得到了预期的输出。我感谢您的建议,并将在可能的情况下尝试使用参数。然而,我正在处理一个现有的数据库,该数据库包含大小适中的查询,其中包含很多逻辑。我无法更改数据库,但我必须尝试并支持不同的格式。我必须在现有结构和设计的范围内这样做。@Adamheg我根本没有建议更改数据库-只是查询它的方式我不明白为什么查询太大而无法使用参数化SQL…@JonSkeet如果有什么问题的话,这会使它更重要,因为否则:查询计划缓存饱和,b:由于代码原因,不可能很容易看到错误density@MarcGravell我得多考虑一下。我用于日期的数据来自于每个日期、月份、年份值的单独列(如编辑问题中所述)。所以,它们实际上并不像我的测试用例所显示的那样是一个参数。在查询中执行所有逻辑对我来说都是新的。我感谢您的建议,并在可能的情况下尝试使用参数。然而,我正在处理一个现有的数据库,该数据库包含大小适中的查询,其中包含很多逻辑。我无法更改数据库,但我必须尝试并支持不同的格式。我必须在现有结构和设计的范围内完成这项工作。@adamheg我根本没有建议更改数据库-只是按照你查询它的方式我看不到