2012-07-18 4 views
1

Использование EntityFramework v4.1 и IBM Data Server Client v9.7fp5, DB сгенерированный код на основе предопределенной таблицы DB2, которая имеет столбцы DATE. Столбцы DATE DB2 сопоставляются типам данных .NET DateTime во время генерации кода.Переполнение поля Datetime с IBM Data Server Client v9.7fp5

При попытке INSERT строку, следующее сообщение об ошибке

ERROR [22008] [IBM] переполнение CLI0114E поле DateTime. SQLSTATE = 22008

, что имеет смысл, поскольку .NET не имеет типа данных DATE, только DATETIME, и этот атрибут будет иметь больше данных, чем ожидал бы столбец DB2 DATE.

Вопросов

  1. почему не код .NET база автоматически конвертировать с помощью ToShortDateString() и обеспечить DB2, что он ожидает?

  2. Какие подходы можно использовать для переопределения базовой логики .NET и преобразования значения в код приложения до того, как .NET отправит транзакцию SQL в DB2?

Любая помощь или отзывы будут оценены. Благодаря!

ответ

4

Прочитано datetime Data Type Conversions (ODBC). Он определяет различные правила в datatype conversions. Один из них перечислены ниже - SQLSTATE 22008.

Если усечение секунд или долей секунд происходит при преобразовании из C в SQL, диагностическая запись генерируется с SQLSTATE 22008 и сообщением «Datetime переполнение поля».

Ключевым моментом здесь является то, чтобы убедиться, что не происходит в считанные секунды не truncation/доли секунды

ДАТА типов данных

Если столбец базы данных DB2 является DATE тип данных, создать переменную, как указано ниже:

new DateTime(2012,3,4); //No time part 

TIMESTAMP DataType

Если столбец базы данных DB2 является TIMESTAMP тип данных, удалить часть миллисекунд:

dateTime = new DateTime(dateTime.Ticks - (dateTime.Ticks % TimeSpan.TicksPerSecond),dateTime.Kind); 

Reference:

  1. How to truncate milliseconds off of a .NET DateTime
  2. Why is SQL Server losing a millisecond?

ВСТАВИТЬ DB2 для DATE и TIMESTAMP

Если вы вставки с прямым заявлением SQL в DB2,

формата использования TimeStamp как '2012-12-17-16.53.57.285754'

и

для DATE используйте формат CAST ('2012-12-10' AS DATE)

+1

Это спасло нас, спасибо! Прежде чем вставлять в любые столбцы с типом 'DATE', мы просто вызываем' OurDateValue.Date', и все идет гладко. Блестящий, даже если немного глупый. –