2013-03-14 2 views
2

У меня есть .Net-приложение, использующее EF4 и DB2 LUW и iSeries.Обновление столбцов DATE/TIME/TIMESTAMP iSeries .Net

Когда мы запускаем команду в DB2, мы клонируем исходную команду в новую iDB2Command, копируем параметры и запускаем. Все отлично работает, пока не дойдем до столбцов DATE. В этот момент AS400 или драйвер, похоже, падают: он получает параметр, который говорит, что это DbTypes.DateTime и содержит объект DateTime, но столбец DATE.

Ошибка, указанная ниже (на LUW). AS400 (v6r1m0) возвращает несколько иной формулировки

ERROR [22008] [IBM] CLI0114E Datetime field overflow. SQLSTATE=22008

код выглядит примерно так (и полностью ISeries/DB2-LUW агностик)

// all generic System.Data classes, no iDB2Connection datatype. The driver isn't even 
// installed on dev/build machines at this point. We rely on .Net reading the connection 
// string from App.config to create the proper DB Driver (db2-luw or iSeries) 

DbConnection c = ... get connection from somewhere... 
DbCommand cmd = c.CreateCommand(); 

var p = cmd.CreateParameter(); 
p.ParamterName = "V_XXX_XXX"; 
p.DbType = DbTypes.DateTime; 
p.Value = DateTime.Now; 
cmd.AddParamter(p); 
... 

Так ...

Есть ли что-то, что мы делаем неправильно здесь? Для отправки LUW параметра как DbTypes.DateTime работает отлично. EDIT: Он работал очень хорошо на LUW, потому что мы отправляли усеченную дату в локальном тестовом коде (например, Now.Date). Нормальный DateTime.Now с ошибкой усечения так же, как на AS400)

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

** Решение **

Благодаря @ микрофон-Willis, мы просто проверить столбец перед созданием команды и сделать вручную усечение при необходимости.

// get the db2 column type from our model metadata, because in .net it is all just DateTime 
cmd.AddParamter("@MyDateColumn", FixParam(dateObject, metatdata.ColumnType); 

// fix up different types of parameters. real version does a lot more validation 
public object FixParam(object value, string db2columnType) { 
    if (db2columnType == "date") return ((DateTime)value).Date; 
    ... 
    return value; 
} 

Спасибо, все вы, ребята из DB2.

ответ

1

Исходя из i, вы можете просто назначить из поля DATE поле DateTime.

DateTime EmployeeSignedDateTime = i.Field<DateTime>("EMP_SIGNED_DATE").Add(i.Field<DateTime>("EMP_SIGNED_TIME").TimeOfDay) 

Чтобы отправить в I, вы можете сделать следующее:

p.Add("@EMPLOYEE_SIGNED_DATE", iDB2DbType.iDB2Date).Value = DateTime.Now.Date; 
p.Add("@EMPLOYEE_SIGNED_TIME", iDB2DbType.iDB2Time).Value = DateTime.Now.ToString("HH.mm.ss"); 

Обратите внимание, что я использую IBM.Data.DB2.iSeries.dll.

+0

Мы не используем iSeries DLL, поэтому у нас нет доступа к структуре 'iDB2DbType'. Я буду тестировать его завтра утром на клиентском сайте, где у нас есть доступ к живому дыханию iSeries: D Looks promsing. Мы оставляем это 'DbTypes.DateTime', но это также может быть изменено, если необходимо, на' DbTypes.Date'. Время отладки: D –

Смежные вопросы