我有一个使用 EF4 以及 DB2 LUW 和 iSeries 的 .Net 应用程序。
当我们在 DB2 上运行命令时,我们将原始命令克隆到新的 iDB2Command 中,复制参数并运行。这一切都很好,直到我们进入DATE
专栏。在这一点上,AS400 或驱动程序似乎跌倒了:它得到一个参数,说它是 a 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 将参数作为 a 发送 编辑:它在 LUW 上工作得很好,因为我们在本地测试代码中发送了一个截断的日期(例如,DbTypes.DateTime
就可以了。Now.Date
)。正常DateTime.Now
失败并出现截断错误,就像在 AS400 上一样)
此外,我们有关于类型的完整元数据,所以理论上可以在转换时告诉转换为什么System.DbTypes
。我们希望这就是需要做的所有事情(或hacky转换为字符串的东西),而不是一些潜在的问题。
** 解决方案 **
感谢@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 人。