ADO.NET DateTime sql参数丢失准确性

时间:2014-12-22 05:11:33

标签: c# sql-server datetime ado.net

我正在尝试使用ADO.NET for SQL Server删除记录,其中有一个带有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();
}

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

我检查了Sql Profier,发现sql命令中的UtcTimeStamp参数被解析为2014-12-22 04:53:21.970,我认为这就是为什么我的代码无效。

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

2 个答案:

答案 0 :(得分:1)

好的,我想我已经找到了重点: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;
}

答案 1 :(得分:0)

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