无法将日期传递到存储过程

时间:2012-04-28 10:53:04

标签: c# sql date

尝试将日期传递到存储过程,如下所示:

@dateRegistered = '28/04/2012'

但它一直告诉我:

  

将数据类型varchar转换为日期时出错。

如果我按照以下方式工作:

@dateRegistered = '04/28/2012'

但这不是我想要使用的格式。

我运行了以下查询来设置格式:

SET DATEFORMAT dmy

为什么不起作用?

编辑:我是这样做的:

在我的存储过程中,我把:

SET DATEFORMAT dmy

然后从代码中,我将其传递为:

myCommand.Parameters.Add("@dateRegistered", SqlDbType.Date);
myCommand.Parameters["@dateRegistered"].Value = DateTime.Now.ToString("dd/mm/yyyy");

我将其作为字符串传递,以确保即使我的计算机(或服务器)具有不同的日期格式,它也将始终使用dmy。

修改编辑:

我把它传递给datetime.now。它在发送时似乎将其转换为默认格式,然后在我阅读时将其转换回我的计算机格式。不确定这是怎么发生的,但似乎工作正常。

4 个答案:

答案 0 :(得分:3)

当您尝试传递date(对应于数据库中的string)时,看起来参数是varchar(在数据库中)。如果您改为传递.NET DateTime对象,它应该按预期工作。

答案 1 :(得分:2)

避免头痛并使用明确的日期格式 - 20120428 (YYYYMMDD)2012-04-28

顺便说一下:你提到你使用C#(基于标签) - 你是如何使用ADO.NET的?或者是Linq to SQL / EF /其他一些ORM?

编辑:

好的,使用CONVERT函数以及指示日期字符串格式的适当参数

EG:

declare @D datetime
set @D = CONVERT(datetime, '04/28/2012', 101)
print @D

101是美国标准格式mm/dd/yyyy

使用转换将确保它始终可以正常工作,无论任何环境设置如日期顺序。

答案 2 :(得分:1)

如果您拨打set dateformat dmy,则只会影响当前连接。在将字符串转换为日期之前,您必须每次都设置它。

最好的解决方案可能是ISO格式,就像@IanYates建议的那样。

答案 3 :(得分:1)

亲爱的,您的代码在使用后正在运行 * SET DATEFORMAT dmy 因为你把日期传递为“dd / MM / yyyy” 比如“DateTime.Now.ToString(”dd / mm / yyyy“)”

按照以下命令检查数据库中的日期格式: -

  • dbcc useroptions

并默认选中“dateformat:mdy”。因此,以“MM / dd / yyyy”格式传递日期也可以正常工作。

快乐编码:)