У меня есть .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 параметра как
EDIT: Он работал очень хорошо на LUW, потому что мы отправляли усеченную дату в локальном тестовом коде (например, DbTypes.DateTime
работает отлично.
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.
Мы не используем iSeries DLL, поэтому у нас нет доступа к структуре 'iDB2DbType'. Я буду тестировать его завтра утром на клиентском сайте, где у нас есть доступ к живому дыханию iSeries: D Looks promsing. Мы оставляем это 'DbTypes.DateTime', но это также может быть изменено, если необходимо, на' DbTypes.Date'. Время отладки: D –