Преобразование типа данных datetime2 в тип данных datetime приводит к выходу за пределы допустимого значения - PullRequest
336 голосов
/ 26 августа 2009

У меня есть таблица данных с 5 столбцами, где строка заполняется данными, а затем сохраняется в базе данных посредством транзакции.

При сохранении возвращается ошибка:

Преобразование типа данных datetime2 в тип данных datetime привело к значению вне диапазона

Из прочитанного следует, что моя таблица данных имеет тип DateTime2, а моя база данных - DateTime; это неправильно.

В столбце даты установлено значение DateTime, например:

new DataColumn("myDate", Type.GetType("System.DateTime"))

Вопрос

Может ли это быть решено в коде или что-то должно быть изменено на уровне базы данных?

Ответы [ 18 ]

4 голосов
/ 29 марта 2016

Я нашел этот пост, пытаясь понять, почему я продолжал получать следующую ошибку, которая объясняется другими ответами.

Преобразование типа данных datetime2 в тип данных datetime привело к значению вне допустимого диапазона.

Используйте обнуляемый объект DateTime.
общедоступный DateTime? PurchaseDate {get; задавать; } * +1010 *

Если вы используете платформу сущностей Установите для свойства nullable в файле edmx значение True

Set the nullable property in the edmx file to **True**

3 голосов
/ 04 мая 2016

Поскольку andyuk уже указал, это может произойти, когда значение NULL назначено для поля NULL, допускающего нулевое значение DateTime . Попробуйте изменить DateTime на DateTime? или Nullable <<strong> DateTime >. Имейте в виду, что, если вы используете Свойство зависимости , следует также убедиться, что тип вашего свойства зависимости также имеет тип DateTime с нулевым значением.

Ниже приведен реальный пример неполного DateTime * от 1020 * до DateTime? корректировки типа, которая вызывает нечетное поведение

enter image description here

2 голосов
/ 15 февраля 2012

Entity Framework 4 работает с типом данных datetime2, поэтому в db соответствующее поле должно быть datetime2 для SQL Server 2008.

Для достижения решения есть два пути.

  1. Чтобы использовать тип данных datetime в Entity Framwork 4, вам нужно переключить ProviderManifestToken в edmx-файле на «2005».
  2. Если вы установите соответствующее поле как Allow Null (оно преобразует его в NULLABLE), тогда EF автоматически использует объекты даты как datetime.
1 голос
/ 05 ноября 2014

Создан базовый класс на основе реализации @ sky-dev. Так что это может быть легко применено к нескольким контекстам и сущностям.

public abstract class BaseDbContext<TEntity> : DbContext where TEntity : class
{
    public BaseDbContext(string connectionString)
        : base(connectionString)
    {
    }
    public override int SaveChanges()
    {

        UpdateDates();
        return base.SaveChanges();
    }

    private void UpdateDates()
    {
        foreach (var change in ChangeTracker.Entries<TEntity>())
        {
            var values = change.CurrentValues;
            foreach (var name in values.PropertyNames)
            {
                var value = values[name];
                if (value is DateTime)
                {
                    var date = (DateTime)value;
                    if (date < SqlDateTime.MinValue.Value)
                    {
                        values[name] = SqlDateTime.MinValue.Value;
                    }
                    else if (date > SqlDateTime.MaxValue.Value)
                    {
                        values[name] = SqlDateTime.MaxValue.Value;
                    }
                }
            }
        }
    }
}

Использование:

public class MyContext: BaseDbContext<MyEntities>
{

    /// <summary>
    /// Initializes a new instance of the <see cref="MyContext"/> class.
    /// </summary>
    public MyContext()
        : base("name=MyConnectionString")
    {
    }
    /// <summary>
    /// Initializes a new instance of the <see cref="MyContext"/> class.
    /// </summary>
    /// <param name="connectionString">The connection string.</param>
    public MyContext(string connectionString)
        : base(connectionString)
    {
    }

     //DBcontext class body here (methods, overrides, etc.)
 }
0 голосов
/ 19 августа 2015

у вас будет столбец даты, который был установлен как минимум значения минимальной разрешенной даты, например 1/1/1001.

Чтобы преодолеть эту проблему, вы можете установить правильное значение даты и времени для свойства ur, а также установить другое магическое свойство, например IsSpecified = true.

0 голосов
/ 20 марта 2012

В моем случае мы приводили дату к дате и получили эту ошибку. Что происходит, так это то, что Date имеет «более ориентированный на программиста» минимум 01.01.0101, а Datetime застрял на 1753

Добавьте к этому ошибку сбора данных, и вы получите исключение!

0 голосов
/ 04 июня 2019

Добавление этого кода в класс в ASP.NET сработало:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Properties<DateTime>().Configure(c => c.HasColumnType("datetime2"));
}
0 голосов
/ 28 января 2014

Иногда он отлично работает на машинах разработки, а не на серверах. В моем случае я должен был поставить:

<globalization uiCulture="es" culture="es-CO" />

В файле web.config.

Часовой пояс на компьютере (сервере) был верным (для языкового стандарта CO), но веб-приложение - нет. Эта настройка выполнена, и она снова заработала нормально.

Конечно, все даты имели значение.

: D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...