C# 从.Net更新iSeries日期/时间/时间戳列

C# 从.Net更新iSeries日期/时间/时间戳列,c#,orm,entity-framework-4,db2,ibm-midrange,C#,Orm,Entity Framework 4,Db2,Ibm Midrange,我有一个使用EF4以及DB2LUW和iSeries的.Net应用程序 在DB2上运行命令时,我们将原始命令克隆到新的IDB2命令中,复制参数,然后运行。在我们进入DATE列之前,一切都很好。此时AS400或驱动程序似乎崩溃了:它得到一个参数,表示它是一个DbTypes.DateTime,并包含一个DateTime对象,但列是DATE 返回的错误(在LUW上)如下所示。AS400(v6r1m0)返回的措辞略有不同 错误[22008][IBM]CLI0114E日期时间字段溢出。SQLSTATE=22

我有一个使用EF4以及DB2LUW和iSeries的.Net应用程序

在DB2上运行命令时,我们将原始命令克隆到新的IDB2命令中,复制参数,然后运行。在我们进入
DATE
列之前,一切都很好。此时AS400或驱动程序似乎崩溃了:它得到一个参数,表示它是一个
DbTypes.DateTime
,并包含一个DateTime对象,但列是
DATE

返回的错误(在LUW上)如下所示。AS400(v6r1m0)返回的措辞略有不同

错误[22008][IBM]CLI0114E日期时间字段溢出。SQLSTATE=22008

代码看起来像这样(并且完全是iSeries/DB2-LUW不可知的)

所以

我们有什么地方做错了吗?对于LUW,将参数作为
DbTypes.DateTime
发送就可以了编辑:它在LUW上运行得很好,因为我们在本地测试代码中发送了一个截断的日期(例如,
Now.date
)。正常的
DateTime。现在
会出现截断错误,就像在AS400上一样)

此外,我们在类型上有完整的元数据,因此从理论上讲,在转换时可以判断要转换成什么
System.DbTypes
。我们希望这就是所有需要做的事情(或者将黑客代码转换成字符串),而不是一些潜在的问题

**解决方案**

多亏了@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人员。

来自i,您可以从
日期
字段分配到
日期时间
字段

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

注意,我使用的是
IBM.Data.DB2.iSeries.dll

我们没有使用iSeries DLL,因此无法访问
iDB2DbType
结构。明天早上我将在客户现场测试,在那里我们可以使用活生生的呼吸器:不过D看起来很有前途。我们将其保留为
DbTypes.DateTime
,但如果需要,也可以将其更改为
DbTypes.Date
。调试时间:D
DateTime EmployeeSignedDateTime = i.Field<DateTime>("EMP_SIGNED_DATE").Add(i.Field<DateTime>("EMP_SIGNED_TIME").TimeOfDay)
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");