Microsoft AccessデータベースのデータをMS SQL Serverデータベースにアーカイブするコードがあります。 Accessテーブルから既にデータリーダーが読み込まれていて、挿入の準備としてSqlCommandにパラメータを追加しようとしている場合、型キャストが失敗しています。なぜshortからintへのキャストが失敗するのですか?
oSqlServerDbCmd_ForInsert.Parameters.AddWithValue("@Duration",
(int) oReader["Duration"]);
oReaderからのフィールドは、実際にはAccess Integerであり、これはC#の略です。ここに短いものを投げると問題はありません。しかし、intにキャストすると、コードはInvalidCastExceptionをスローします。 MSDN documentation:
"shortからint、long、float、double、またはdecimalへの暗黙の変換があらかじめ定義されています。"
...しかし、これはうまくいくはずです(明示的な型変換はなぜ暗黙の変換が定義されているのでしょうか?)。 AddWithValueはオブジェクトを受け入れるので、キャストは必要ではないことに気づきます。実際にコードからキャストを削除しましたが、このキャストが失敗した理由を説明したいと思います未来。
このhttp://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx –
のエリックリペットから良い記事これは、あなたの答えではありませんあなたの '@ Duration'パラメータには、数値データ型の場合、 'AddWithValue'呼び出しで文字列値を使用したくない場合です。 – phoog
@phoogこの問題が本当に終わったことから気を散らしているので、私は変換を取り除くためにコードを編集しました。簡単な答えは、文字列の変換は、コードを継承したときにコード内にあることです。ソースDBのデータ型を変更するまでは動作していたので、コードを調べる必要はありませんでした。一度それが壊れて、私たちが掘り出したのは、文字列の変換が不要であることが分かりました(問題ではありませんが、それを信じるかどうかは分かりません)。 –