При вставке значений в поле даты возникает исключение

При вставке поля значения на дату в таблицу POP10100 возникает такое исключение:

System.Data.SqlClient.SqlException: инструкция INSERT конфликтует с ограничением CHECK "CK_POP10100_DISCDA__009508B4". Конфликт произошел в базе данных "TWO", таблица "dbo.POP10100", столбец "DISCDATE". Заявление было прекращено. at System.Data.SqlClient.SqlConnection.OnError (исключение SqlException, логическое значение breakConnection) at System.Data.SqlClient.SqlInternalConnection.OnError (исключение SqlException, логическое значение breakConnection)

Когда я проверил поле "DISCDATE", оно было написано так:

ALTER TABLE [dbo].[POP10100]  WITH CHECK 
  ADD CHECK  ((datepart(hour,[DISCDATE])=(0) 
             AND datepart(minute,[DISCDATE])=(0) 
             AND datepart(second,[DISCDATE])=(0) 
             AND datepart(millisecond,[DISCDATE])=(0)))

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


person Jims    schedule 02.01.2011    source источник


Ответы (2)


datepart возвращает часть заданной даты и времени.

Таким образом, гарантируется, что значения часов, минут, секунд и миллисекунд равны нулю.

Обновление: вместо того, чтобы просто передавать DateTime как есть, используйте свойство Date. например:

var date = DateTime.Now.Date;
person Community    schedule 02.01.2011
comment
@Will Hughes: привет, я использую хранимую процедуру e-connect, в которой есть входной параметр UpdateIfexits (тип small int), как я могу справиться с этим из C#, помогите, пожалуйста.. - person Jims; 02.01.2011
comment
Задает ли хранимая процедура значение даты или оно передается как параметр из С#? Можете ли вы изменить хранимую процедуру или только код C#? - person Sparky; 02.01.2011
comment
@Sparky: я не могу изменить SP, я вижу только параметры и передаю эти параметры из C#. - person Jims; 02.01.2011
comment
Вы передаете дату как часть вызова процедуры? Если это так, используйте метод C# ToString(MM/dd/yyyy), чтобы удалить часть времени из параметра даты. Если вы не передаете дату, то кому-то нужно изменить хранимую процедуру, чтобы усечь часть времени из значения даты, записанного в базу данных. - person Sparky; 02.01.2011
comment
@Sparky Правильный метод получения только Date из DateTime — вызвать свойство Date. - person ; 02.01.2011
comment
Спасибо, Уилл, я обычно использую ToString, чтобы получить больше контроля над форматом, но метод Date, вероятно, работает лучше для этого примера... - person Sparky; 02.01.2011

Похоже, он примет только дату, которая имеет время полуночи (00:00:00). Вероятно, это связано с тем, что до SQL Server 2008 не существовало типа данных, который содержал бы только значение даты, он содержал бы значение даты и времени.

person Brian Ball    schedule 02.01.2011
comment
s: привет, я использую хранимую процедуру e-connect, в которой есть входной параметр UpdateIfexits (тип small int), как я могу справиться с этим из C #, помогите, пожалуйста.. - person Jims; 02.01.2011
comment
Если это маленькое целое преобразуется в дату и время, вам нужно посмотреть, как это делает хранимая процедура, поскольку прямого преобразования из небольшого int в дату и время нет. Small int в С# короткий. Вы можете попробовать то, что предложил Уилл Хьюз, и передать свойство Date вашего DateTime и посмотреть, работает ли это. - person Brian Ball; 02.01.2011