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
对输入使用完全相同的精度呢?
好的,我想我已经找到了重点: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
.