2

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

そう...

ここで間違っていることはありますか? パラメータを として送信する LUW の場合、DbTypes.DateTime問題なく動作します。 編集:ローカル テスト コード (例: ) で切り捨てられた日付を送信していたため、LUW で問題なく動作しましたNow.DateDateTime.NowAS400 の場合と同様に、通常は切り捨てエラーで失敗します)

また、型に関する完全なメタデータがあるため、理論的には、変換時に何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 関係者の皆様、ありがとうございます。

4

1 に答える 1

1

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

于 2013-03-14T14:52:52.087 に答える