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 の場合、 編集:ローカル テスト コード (例: ) で切り捨てられた日付を送信していたため、LUW で問題なく動作しましたDbTypes.DateTime
問題なく動作します。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 関係者の皆様、ありがとうございます。