У меня есть таблица данных с 5 столбцами, где строка заполняется данными, а затем сохраняется в базе данных посредством транзакции.
При сохранении возвращается ошибка:
Преобразование типа данных datetime2 в тип данных datetime привело к значению вне допустимого диапазона
Из прочитанного следует, что моя таблица данных имеет тип DateTime2
и базу данных a DateTime
; это не правильно.
Столбец даты устанавливается DateTime
так:
new DataColumn("myDate", Type.GetType("System.DateTime"))
Вопрос
Это может быть решено в коде или что-то должно быть изменено на уровне базы данных?
источник
Это может произойти, если вы не присвоите значение полю DateTime, когда поле не принимает значения NULL .
Это исправило это для меня!
источник
Как
DATETIME
иDATETIME2
карту , чтобыSystem.DateTime
в .NET - вы не можете сделать «преобразования», так как это на самом деле тот же тип .NET.См. Страницу документа MSDN: http://msdn.microsoft.com/en-us/library/bb675168.aspx.
Для этих двух значений есть два разных значения.
SqlDbType
Можете ли вы указать их в своемDataColumn
определении?НО: на SQL Server поддерживаемый диапазон дат совсем другой.
DATETIME
поддерживает 1753/1/1 в «вечность» (9999/12/31), аDATETIME2
поддерживает 0001/1/1 - в вечность.Итак, что вам действительно нужно сделать, это проверить год даты - если это до 1753 года, вам нужно изменить его на что-то ПОСЛЕ 1753 года, чтобы
DATETIME
столбец в SQL Server мог его обработать.Марк
источник
DtInit = new System.DateTime(1492, 10, 12),
выходит из строя.В моей базе данных SQL Server 2008 у меня был
DateTime
столбец, помеченный как не обнуляемый, но сGetDate()
функцией в качестве значения по умолчанию. При вставке нового объекта с использованием EF4 я получил эту ошибку, потому что я не передавал свойство DateTime в моем объекте явно. Я ожидал, что функция SQL будет обрабатывать дату для меня, но это не так. Моим решением было отправить значение даты из кода, а не полагаться на базу данных для ее генерации.источник
Nullable<DateTime>
, и в коде я могу оставить это действительно нулевым (вместо 01.010000). Я был приятно удивлен, увидев, что EF to SQL знал, что игнорировать этот ноль в INSERT и использовать дату с сервера (GetDate()
) ... Для нас это было даже предпочтительнее, поскольку нам требовалась лучшая согласованность на сервере, не беспокоясь о разнице часов между веб-сервер и сервер SQL.для меня это было потому, что дата была ..
в этом случае вы хотите присвоить нулевой объект EF DateTime ... используя мой FirstYearRegistered код в качестве примера
источник
Этот сводил меня с ума. Я хотел избежать использования обнуляемой даты (
DateTime?
). У меня не было возможности использоватьdatetime2
тип SQL Server 2008 либоВ конце концов я выбрал следующее:
источник
[Column(TypeName = "datetime2")]
?Иногда EF не знает, что имеет дело с вычисляемым столбцом или триггером . По замыслу эти операции будут устанавливать значение вне EF после вставки.
Исправление - указать
Computed
в EFedmx
для этого столбца вStoreGeneratedPattern
свойстве.Для меня это было, когда в столбце был триггер, который вставил текущую дату и время, см. Ниже в третьем разделе.
Шаги для решения
В Visual Studio откройте
Model Browser
страницу,Model
затемEntity Types
-> затемStoreGeneratedPattern
Computed
Для этой ситуации другие ответы - обходные пути, для столбца нужно указать время / дату, указанную при создании записи, и это задача SQL - выполнить триггер для добавления правильного времени. Например, этот триггер SQL:
DEFAULT (GETDATE()) FOR [DateCreated]
,источник
GETDATE()
что я буквально сделал в то время. Но недавно был комментарий, который следует использоватьSYSDATETIME()
для любых операций DateTime2, которые я считаю верными.Я наткнулся на это и добавил следующее в свой объект datetime:
источник
using System.ComponentModel.DataAnnotations.Schema;
требуетсяЕсли мы не передадим поле даты в дату, будет передана дата по умолчанию {1/1/0001 12:00:00 AM}.
Но эта дата несовместима с работой фрейма сущности, поэтому она преобразует преобразование типа данных datetime2 в тип данных datetime, что приводит к значению вне допустимого диапазона.
Просто
default DateTime.now
в поле даты, если вы не проходите ни одной даты.источник
Проще всего было бы изменить базу данных на использование datetime2 вместо datetime. Совместимость прекрасно работает, и вы не получите ошибок.
Вы все еще хотите сделать кучу тестирования ...
Ошибка, вероятно, связана с тем, что вы пытаетесь установить дату на год 0 или что-то еще, но все зависит от того, где у вас есть контроль, чтобы что-то изменить.
источник
Я нашел этот пост, пытаясь понять, почему я продолжал получать следующую ошибку, которая объясняется другими ответами.
Преобразование типа данных datetime2 в тип данных datetime привело к значению вне допустимого диапазона.
Используйте обнуляемый объект DateTime.
общедоступный DateTime? PurchaseDate {get; набор; }
Если вы используете Entity Framework, установите для свойства nullable в файле edmx значение True.
источник
Как уже отмечал andyuk , это может произойти, когда значение NULL присваивается необнуляемому полю DateTime . Подумайте об изменении DateTime на DateTime? или Nullable < DateTime >. Имейте в виду, что в случае использования свойства зависимости также следует убедиться, что тип свойства зависимости также имеет тип DateTime, допускающий значение NULL.
Ниже приведен реальный пример неполного DateTime для DateTime? корректировка типа, которая вызывает странное поведение
источник
Entity Framework 4 работает с типом данных datetime2, поэтому в db соответствующее поле должно быть datetime2 для SQL Server 2008.
Для достижения решения есть два способа.
источник
Создан базовый класс на основе реализации @ sky-dev. Так что это может быть легко применено к нескольким контекстам и сущностям.
Применение:
источник
Добавьте указанный ниже атрибут для свойства в классе вашей модели.
Изначально я забыл добавить этот атрибут. Так что в моей базе данных ограничение было создано как
и я добавил этот атрибут и обновил мой БД, то он был изменен на
источник
В моем случае мы приводили дату к дате и получили эту ошибку. Что происходит, так это то, что Date имеет «более ориентированный на программиста» минимум 01.01.0101, а Datetime застрял на 1753
Объедините это с ошибкой сбора данных с нашей стороны, и вы получите свое исключение!
источник
Иногда это прекрасно работает на машинах разработки, а не на серверах. В моем случае я должен был поставить:
В файле web.config.
Часовой пояс на компьютере (сервере) был правильным (в соответствии с локализацией CO), но веб-приложение - нет. Эта настройка выполнена, и она снова заработала нормально.
Конечно, все даты имели значение.
: D
источник
Добавление этого кода в класс в ASP.NET сработало для меня:
источник
Я знаю об этой проблеме, и вы все должны быть тоже
https://en.wikipedia.org/wiki/Year_2038_problem
В SQL был создан новый тип поля, чтобы избежать этой проблемы (datetime2).
Этот тип поля «Дата» имеет те же значения диапазона, что и класс DateTime .Net. Это решит все ваши проблемы, поэтому я думаю, что лучший способ решить это - изменить тип столбца вашей базы данных (это не повлияет на данные вашей таблицы).
источник
Проверьте следующие два: 1) Это поле не имеет значения NULL. Например:
Заменить на:
2) Новая база данных снова. Например:
источник
Проблема с унаследованным атрибутом datetime
Это сообщение об ошибке часто отображается, когда поле даты без ненулевого значения имеет значение null во время вставки / обновления. Одной из причин может быть наследство.
Если ваша дата унаследована от базового класса, и вы не делаете отображение, EF не будет читать ее значение.
Для получения дополнительной информации: https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and- выбор-стратегии-принципы
источник
Я увидел эту ошибку, когда хотел отредактировать страницу с помощью ASP.Net MVC. У меня не было проблем при создании, но обновление базы данных сделало мое свойство DateCreated вне диапазона!
Если вы не хотите, чтобы ваше
DateTime
свойство было Nullable, и не хотите проверять, находится ли его значение в диапазоне sql DateTime (и@Html.HiddenFor
это не помогает!), Просто добавьтеstatic DateTime
поле внутри связанного класса (Controller) и присвойте ему значение, когда GET работает, затем используйте его, когда POST делает свою работу:источник
Я столкнулся с этой проблемой в простом проекте консольного приложения, и мое быстрое решение - преобразовать любые возможные даты datetime2 в обнуляемую datetime, запустив этот метод:
Это, конечно, не совсем комплексный метод, но он работал для моих нужд, и, возможно, он поможет другим!
источник
Проверьте формат req в БД. например, моя БД имеет значение по умолчанию или Binding
(((1)/(1))/(1900))
источник
у вас будет столбец даты, который был установлен как минимум значения минимальной разрешенной даты, например 1/1/1001.
Чтобы преодолеть эту проблему, вы можете установить правильное значение datetime, чтобы свойство urn также установило другое магическое свойство, например IsSpecified = true.
источник