Я пытаюсь удалить записи с ADO.NET для SQL Server, из которых есть команда sql с параметром типа DateTime
.
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, обнаружил, что параметр UtcTimeStamp
в sql-команде был проанализирован до 2014-12-22 04:53:21.970
Я думаю, почему мой код не работает.
Итак, как заставить синтаксический UtcTimeStamp
использовать точно такую же точность при вводе?
Хорошо, я думаю, что нашел суть: второй аргумент SqlParameter
, это должно быть
new SqlParameter("@UtcTimeStamp", SqlDbType.DateTime2) { Value = exactTime }
Если я DbType
в него DbType
, он будет идентифицирован им другим конструктором:
public SqlParameter(string parameterName, object value) : this()
{
this.ParameterName = parameterName;
this.Value = value;
}
Таким SqlDbType
свойство SqlDbType
этого экземпляра будет использовать по умолчанию SqlDbType.DateTime
, что неверно. Вместо этого я должен использовать этот конструктор:
public SqlParameter(string parameterName, SqlDbType dbType) : this()
{
this.ParameterName = parameterName;
this.SqlDbType = dbType;
}
Убедитесь, что при сохранении этого vlaue в db его тип - DbType.DateTime2
потому что этот тип округляет значение наносекунд с точностью 100. Так что, когда вы сохраняете это в базе данных, вы сохраняете его как DbType.DateTime
убедитесь, что он DbType.DateTime2
.
Datetime
никогда не используются для удаления записи. Используется только в случае фильтра данных (Отчеты).Decimal
типа.