2013-03-14 93 views
2

我有一個使用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發送參數作爲 DbTypes.DateTime工作得很好。 編輯:它在LUW上工作得很好,因爲我們在本地測試代碼中發送截短的日期(例如,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員工。

回答

1

來自我,你可以只從DATE字段分配到DateTime字段。

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"); 

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

+0

我們沒有使用iSeries DLL,因此我們無法訪問'iDB2DbType'結構。我會在明天早上在客戶現場進行測試,在那裏我們可以享受活躍的呼吸。i系列:D看起來雖然徘徊不前。我們將它保留爲'DbTypes.DateTime',但如果需要,可以將其更改爲'DbTypes.Date'。調試時間:D – 2013-03-14 16:16:05