从.Net更新iSeries DATE / TIME / TIMESTAMP列

时间:2013-03-14 14:24:10

标签: c# orm entity-framework-4 db2 ibm-midrange

我有一个使用EF4以及DB2 LUW和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发送工作正常。 编辑: 它在LUW上工作正常,因为我们在本地测试代码中发送截断日期(例如Now.Date)。正常DateTime.Now失败,截断错误就像在AS400上一样

此外,我们有关于该类型的完整元数据,因此理论上可以在转换时告知要转换为System.DbTypes的内容。我们希望所有这一切都需要完成(或者是hacky convert-to-string stuff),而不是一些潜在的问题。

**解决方案**

感谢@ mike-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 个答案:

答案 0 :(得分: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