System.Data.SqlTypes.SqlTypeException: переполнение SqlDateTime - PullRequest
4 голосов
/ 04 августа 2009

Я работаю с C # .net, а также с SQL Server 2008.

У меня возникает следующая ошибка при попытке запустить тестовый модуль в моем проекте.

   System.Data.SqlTypes.SqlTypeException:
   SqlDateTime overflow. Must be between
   1/1/1753 12:00:00 AM and 12/31/9999
   11:59:59 PM..

Таблица базы данных

Column Name: createddate 
Type: datetime
Default Value: (getdate())
Allow Nulls: No.

Я не хочу вставлять созданную дату как часть моего запроса INSERT.

Когда я вручную вводю некоторые данные в таблицу базы данных, я получаю следующую ошибку:

   The row was successfully committed
   to the database. However, a problem
   occurred when attempting  to retrieve
   the data back after commit. Because
   of this the displayed data within the
   row is read-only. To fix this
   problem, please re-run the query.

Я не понимаю, почему я получаю эту ошибку, и не могу найти никого, кто имел эту проблему. Кто-нибудь может помочь?

Ответы [ 5 ]

6 голосов
/ 04 августа 2009

Мэтт, скорее всего, на правильном пути. Вы определили значение по умолчанию для своего столбца, однако оно вступит в силу только в том случае, если вы действительно вставите что-то в свою таблицу в базе данных.

Когда вы проводите модульный тест, как вы говорите, вы, скорее всего, инициализируете переменную DateTime чем-то (или нет - тогда это будет DateTime.MinValue, то есть 01.010001), а затем вы отправляете это SQL Server, и это значение находится за пределами допустимого диапазона для DATETIME на SQL Server (как ясно указано в ошибке).

Итак, вам нужно добавить строку в свой модульный тест .NET, чтобы инициализировать переменную DateTime в «DateTime.Today»:

DateTime myDateTime = DateTime.Today

и затем вставьте это в SQL Server.

ИЛИ: вы можете изменить оператор SQL INSERT, чтобы он не вставлял значение для этого столбца - он выглядит прямо сейчас, он это делает (и пытается вставить эту - для SQL Server - недопустимую дату в таблицу ). Если вы не укажете этот столбец в INSERT, то по умолчанию в столбце будет введено значение getdate(), и в столбец будет вставлена ​​сегодняшняя дата.

Марк

3 голосов
/ 04 августа 2009

Используете ли вы Linq to SQL для написания модульного теста?

Если это так, возможно, он обходит значение по умолчанию getdate () и использует вместо него другое значение, которое выходит за допустимый диапазон.

2 голосов
/ 29 мая 2012

У меня возникла та же проблема, я использовал Linq с файлами DataClasses, автоматически сгенерированными VS2010. Я понял, что Linq не использует значение по умолчанию (GetDate()), но отправит значение Datetime.Min. Как следствие, сервер SQL будет отклонять эту дату и время «01/01/0001», поскольку он не находится в диапазоне.

Чтобы исправить это, я всегда устанавливал значение Datetime.Now или Datetime.Today, поэтому Linq больше не будет отправлять неверное значение Min Datetime.

0 голосов
/ 08 апреля 2010

вы используете установку класса контекста данных с файлом DBML и всем этим джазом? Если это так, то вы можете щелкнуть поле в файле DBML и установить для свойства «Автоматически сгенерированное значение» значение True. Visual Studio уже должна знать, что делать это с полями Pkey, но должна быть настроена на эти «временные» действия

0 голосов
/ 04 августа 2009

Возможно, вы получаете ошибку переполнения в модульном тесте, поскольку вы передаете неинициализированный DateTime со значением DateTime.MinValue, которое выходит за допустимый диапазон для даты и времени SQL.

Я думаю, что видел это сообщение об ошибке при изменении таблицы вручную, это не проблема, просто обновите таблицу.

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