【问题标题】:ADO.NET Update command with datetime parameter issue带有日期时间参数问题的 ADO.NET 更新命令
【发布时间】:2010-02-03 23:55:02
【问题描述】:

我正在尝试使用 ADO.NET 通过存储过程进行数据库更新。

基本上我设置了所有参数和命令,并设置了如下参数之一

DbParameter nm8 = provider.CreateParameter();
nm8.ParameterName = "@EDITDATE";
nm8.DbType = System.Data.DbType.DateTime;
nm8.Value = aObject.ADateTime;
command.Parameters.Add(nm8);

在存储过程中,输入参数定义为

@EDITDATE       datetime = null,

基本上,存储过程所做的只是获取一条记录并使用传入的 EDITDATE 对其进行更新。

但我收到此错误

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

我发现日期时间值被传递到存储过程中,如下所示

2010-02-03 15:26:54.3100000

而不是

2010-02-03 15:26:54.310

我认为这就是导致投射错误的原因。

所以我的问题是为什么 ado.net 以这种格式转换日期时间? 如何在不将值作为字符串传递的情况下解决问题。

非常感谢。

【问题讨论】:

    标签: datetime ado.net parameters


    【解决方案1】:

    这肯定会在 SQL Server 2005 中引发错误:

    print cast('2010-02-03 15:26:54.3100000' as datetime)
    

    而这工作正常:

    print cast('2010-02-03 15:26:54.31' as datetime)
    

    但是...aObject.ADateTime 不是 DateTime 类型的吗?听起来好像是作为字符串传递给存储过程的。

    如果它确实是一个字符串,我建议在传入之前将其转换为 DateTime:

    nm8.Value = DateTime.Parse(aObject.ADateTime);
    

    【讨论】:

    • 感谢回复,ADateTime 确实是DateTime 类型。这就是我不明白的,DbType 设置为 DateTime 并且传入的值也是一个 DateTime 对象(DateTime?准确地说)这不是我需要做的吗?存储过程中的日期时间参数?
    • @Eatdoku 这绝对很奇怪。我从来没有遇到过将 DateTime 传递给这样的存储过程的任何问题。您需要多少精度?你能把日期时间四舍五入到最接近的秒吗?
    • 最近的秒在我的情况下已经足够了。但我认为问题在于 ado.net 在传递到存储过程时如何将 DateTime 转换为字符串。我现在的解决方案是将 DateTime.Tostring(format) 直接作为 DbType.String 传递,它工作正常。仍然有兴趣了解 ado.net 如何转换日期时间以及为什么我会看到这个奇怪的结果。谢谢
    【解决方案2】:

    您必须针对基类进行编程还是可以使用 SqlParameter? (假设您正在使用连接到 Sql Server)也许您可以尝试设置 SqlDbType 属性

    SqlParameter sqlParam = (SqlParameter)nm8; //check if it's compatible before casting.
    sqlParam.SqlDbType = SqlDbType.DateTime
    

    【讨论】:

    • 好点,我正在使用 SQL Server。但我使用 DbProvider 而不是 SqlDatProvider。也许这就是转换后的 DataTime 字符串与 SQL Server 所期望的有点不同的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 2016-11-26
    相关资源
    最近更新 更多