c# - 从 .Net 更新 iSeries DATE/TIME/TIMESTAMP 列

标签 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);
...

所以...

我们这里有什么地方做错了吗? 对于将参数作为 DbTypes.DateTime 发送的 LUW 来说工作正常。 编辑: 它工作正常在 LUW 上很好,因为我们在本地测试代码中发送了一个截断的日期(例如,Now.Date)。正常 DateTime.Now 失败并出现截断错误,就像在 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 开始,您可以将 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

关于c# - 从 .Net 更新 iSeries DATE/TIME/TIMESTAMP 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15411934/

相关文章:

c# - ReactiveUI加载时执行命令

python - 我可以在没有自动 ID 的情况下在 Django 中创建模型吗?

entity-framework - EF Table-per-hierarchy 映射

entity-framework - 将来自 2 个不同模型的 2 个不同实体连接到单个 Linq to Entities 查询中

c# - 使用自定义 IEqualityComparer 对字典进行 XML 序列化

c# - 如何初始化为空的 IEnumerable<Object> 并允许对其进行 Concat?

laravel - 如何在 Laravel Eloquent 中指定我的列不能为空?

java - 如何使用 JPA 获取整个实体图

c# - Entity Framework 转换错误

c# - DllImport 不工作