ADO.NET DateTime sql параметр теряет точность

1

Я пытаюсь удалить записи с 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 использовать точно такую же точность при вводе?

  • 1
    Предлагаю удалить запись на основе первичного ключа like Id. Datetime никогда не используются для удаления записи. Используется только в случае фильтра данных (Отчеты).
  • 0
    @DimitarDimitrov спасибо, но он используется для Decimal типа.
Показать ещё 2 комментария
Теги:
sql-server
datetime
ado.net

2 ответа

1
Лучший ответ

Хорошо, я думаю, что нашел суть: второй аргумент 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;
}
0

Убедитесь, что при сохранении этого vlaue в db его тип - DbType.DateTime2 потому что этот тип округляет значение наносекунд с точностью 100. Так что, когда вы сохраняете это в базе данных, вы сохраняете его как DbType.DateTime убедитесь, что он DbType.DateTime2.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню