我有一個使用EF4以及DB2 LUW和iSeries的.Net應用程序。更新.Net中的iSeries日期/時間/時間戳列。
當我們在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發送參數作爲
編輯:它在LUW上工作得很好,因爲我們在本地測試代碼中發送截短的日期(例如,DbTypes.DateTime
工作得很好。
Now.Date
)。普通DateTime.Now
失敗,截斷誤差就像在AS400)
同時,我們有完整的元數據的類型,所以理論上它可以告訴,在轉換時間,轉換成什麼System.DbTypes
。我們希望這就是所有需要完成的事情(或者轉換爲字符串的東西),而不是一些潛在的問題。
** **解決方案
感謝@麥克 - 威利斯,我們在創建命令之前只檢查列,並在需要時做手工截斷。
// 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'結構。我會在明天早上在客戶現場進行測試,在那裏我們可以享受活躍的呼吸。i系列:D看起來雖然徘徊不前。我們將它保留爲'DbTypes.DateTime',但如果需要,可以將其更改爲'DbTypes.Date'。調試時間:D – 2013-03-14 16:16:05