Почему преобразование пустого значения в datetime2 приводит к ошибке преобразования в SQL? - PullRequest
1 голос
/ 29 февраля 2020

В C# Я получаю это значение для типа datetime2:

{01/01/0001 00:00:00}

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

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

@DateGeneral datetime2 = null

в базе данных и процедура.

Как мне это покрыть?

Ответы [ 4 ]

2 голосов
/ 29 февраля 2020

Это происходит потому, что DateTime является необнуляемым типом значения. 01/01/0001 00:00:00 - это значение по умолчанию.

DateGeneral, с другой стороны, может иметь значение null, что делает значение null в базе данных несовместимым с тем, что имеется в C#.

Чтобы решить эту проблему, используйте тип данных DateTime?, который можно обнулять в вашей программе C#.

0 голосов
/ 29 февраля 2020

Sql сервер DateTime2 с Диапазон дат шире, чем DateTime. Если вы не можете изменить свой код C#, тогда добавьте дезинфицирующий код к своему профессионалу c, типа

create procedure myproc (.. ,@DateGeneral datetime2 = null, ..)
as
..
-- DATETIME compatiblity check
if (@DateGeneral < DATEFROMPARTS(1753,1,1)) then
   @DateGeneral = null;
0 голосов
/ 29 февраля 2020

. Net datetime сопоставляется с типом данных DateTime2 SQL server

** Вот диапазон этих типов данных. ref **

  • Диапазон DateTime: с 1753-01-01 по 9999-12-31

  • Диапазон DateTime2: От 0001-01-01 до 9999-12-31

Чтобы ваше решение работало, вот возможные исправления:

  1. Сделайте. net тип данных обнуляемым, если ваше свойство не нуждается в каком-либо значении.
  2. Сделайте явное преобразование DataType в. Net (слой DAL), сопоставьте его с DataTime2 с установленным EF Столбец [TypeName = "datetime2"] или в свободном коде .HasColumnType ("datetime2")

  3. Укажите значение по умолчанию (в случае нуля от. net) до приемлемого диапазона ,

0 голосов
/ 29 февраля 2020

вы должны использовать это для получения даты datetime datetime.value.tosrting ()

...