ADO.NET 日期时间 sql 参数会失去准确性

本文关键字:失去 准确性 参数 sql NET 日期 时间 ADO | 更新日期: 2023-09-27 18:34:57

我正在尝试删除带有 SQL Server ADO.NET 的记录,其中有一个带有 DateTime 类型参数的 sql 命令。

using (var sqlConnection = new SqlConnection(...))
{
    var command = sqlConnection.CreateCommand();
    command.CommandText = string.Format("DELETE FROM [{0}] WHERE UtcTimeStamp=@UtcTimeStamp", ...);
    command.Parameters.Add(new SqlParameter("@UtcTimeStamp", DbType.DateTime2) { Value = exactTime });
    sqlConnection.Open();
    command.ExecuteNonQuery();
}

例如2014-12-22 04:53:21.9690398,当我传递exactTime时,同时我检查了数据库,存在具有此UtcTimeStamp值的记录,但是在我执行代码后不会删除该记录。

我检查了 Sql Profier,发现 sql 命令中的 UtcTimeStamp 参数被解析为 2014-12-22 04:53:21.970,我认为这就是我的代码不起作用的原因。

那么,如何强制解析UtcTimeStamp对输入使用完全相同的精度呢?

ADO.NET 日期时间 sql 参数会失去准确性

好的,我想我已经找到了重点:SqlParameter的第二个论点不正确,应该是

new SqlParameter("@UtcTimeStamp", SqlDbType.DateTime2) { Value = exactTime }

如果我将DbType传递到它,它将由它的另一个构造函数识别:

public SqlParameter(string parameterName, object value) : this()
{
   this.ParameterName = parameterName;
   this.Value = value;
}

因此,此实例的 SqlDbType 属性将使用默认SqlDbType.DateTime,这是不正确的。相反,我应该使用此构造函数:

public SqlParameter(string parameterName, SqlDbType dbType) : this()
{
   this.ParameterName = parameterName;
   this.SqlDbType = dbType;
}

确保在 db 中保存此 vlaue 时,其类型DbType.DateTime2,因为此类型以 100 的精度舍入纳秒的值。所以我认为当您将其保存在数据库中时,您将其保存为DbType.DateTime确保它是DbType.DateTime2 .