【问题标题】:Cannot pass date into stored procedure无法将日期传递到存储过程
【发布时间】:2012-05-08 22:07:46
【问题描述】:

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

@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 传递。我发的时候好像是把它转换成默认格式,我读的时候又把它转换回我的电脑格式。不确定这是如何发生的,但它似乎工作正常。

【问题讨论】:

  • “我将它作为字符串传递以确保即使我的计算机(或服务器)具有不同的日期格式,它也将始终使用 dmy。”。 NO, NO, NO 将其作为 DateTime 传递 - .NET 库知道如何将 .NET 的 datetime 概念转换为 SQL 概念,并且不需要处理任何字符串格式或模棱两可。

标签: c# sql date


【解决方案1】:

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

【讨论】:

  • 那么在sql管理studio中怎么传日期呢? (用于测试)
  • @TheGateKeeper 在您的情况下,您可以尝试convert(datetime, '04/28/2012', 101)(假设您使用的是 SQL Server)。我不是 SQL Server 大师,所以可能有更好的方法。
  • 如果这个答案是正确的,它也会在月份第一格式中失败,但它不会
【解决方案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

使用 convert 将确保无论日期顺序等任何环境设置如何,它都始终有效。

【讨论】:

  • 当我传递一个数据时间对象时,它似乎可以从代码中工作......但我也希望能够从 SQL Management Studio 对其进行测试。顺便说一句,我不想​​使用 (YYYYMMDD) 格式。
  • 2012-04-28 在 SQL Server 中不起作用,对于 datetime,如果您设置了 british 语言集。 (20120428 确实)
  • 你能检查一下我是否做得对吗?我更新了问题。
【解决方案3】:

如果你调用set dateformat dmy,那只会影响当前的连接。您必须在每次将字符串转换为日期之前设置它。

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

【讨论】:

  • 所以这不是你为数据库设置的东西吗?每次传参数都要设置?
  • 或者更好,传递一个日期时间myCommand.Parameters["@dateRegistered"].Value = DateTime.Now;
  • 您能解释一下如何使用 ISO 格式吗?如果我调用 DateTime.Now 这不会返回具有指定格式的日期给计算机吗?
  • ISO 格式为DateTime.Now.ToString("yyyy-MM-dd"),注意mm 表示分钟,MM 月,see MSDN
【解决方案4】:

亲爱的,您的代码在使用后可以正常工作 * 设置日期格式 dmy 因为您将日期传递为“dd/MM/yyyy” 比如 "DateTime.Now.ToString("dd/mm/yyyy")"

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

  • dbcc 用户选项

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

快乐编码:)

【讨论】:

    猜你喜欢
    • 2014-07-27
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 2012-08-09
    • 2014-08-29
    • 2020-03-04
    • 1970-01-01
    相关资源
    最近更新 更多