我正在尝试使用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
使用与输入完全相同的精度?
答案 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
。