このエラーは、プロジェクトがまだ4.0を対象としているにもかかわらず、サーバーにフレームワーク4.5をインストールしたことが原因のようです。
4.5はCLRを置き換え、tinyint型のオブジェクトをintにアンボックスすることに変更があったようです。これは4.0では機能していましたが、4.5をインストールした後は機能しませんでした。
============================================
答える前に質問全体を読んでください、ほとんどの現在の答えは私が尋ねている質問に答えません。
今日、SQLのtinyintからintを使用したintへのキャストでエラーが発生しました
Daterow datarow = GetOneDatarow(connection,
"SELECT tinyintcolumn FROM table1 WHERE id = 4");
int i = (int)datarow["tinyintcolumn"];
これは、何も変更せずに数年間製品に含まれている古いコードであり、昨日まで機能しています。(そして、それは正確なコードではなく、コンテキストを示すのに十分です)
===更新
正確なエラーメッセージは次のとおりです。「指定されたキャストは無効です!」そして最後の行
int i = (int)datarow["tinyintcolumn"];
は、変数名と列名のみが変更されたエラーをキャストするコードからの正確な行です。
また、データベース列はtinyintで、デフォルト値は0で、インデックスやその他の制約はありませんでした。
===更新を終了します
===アップデート2
Henk Holtermanは、彼の回答で、4.0用に特別にコンパイルされたプロジェクトでもFW 4.5が4.0のCLRを置き換え、これにより既存の4.0の動作がこのようにリモートで変更される可能性があることを通知しました。
私はこれをもう少し開いたままにしますが、彼の答えはこれまでで最も有望です:D===終了
数週間前にフレームワーク3.5から4.0に変更しましたが、これが発生したのは昨日の午後だけでした。昨日の朝、同じコード(再コンパイル後も)は時計仕掛けのように機能しました。
なぜこれが以前は機能していたのか、現在は機能していないのかについて誰かが知っていますか?
マイクロソフトは、暗黙の変換を削除する内部的な変更を行ったことがありますか、それとも以前に純粋な魔法で機能したことがありますか?
データベースの列をintに変更することで解決しましたが、今のところ失敗の原因が何であるかについてはまだ興味があります。
===アップデート3
これを完了するためだけに。
フレームワーク間の変化を見つけました。アップデートで、Microsoftはボクシングとアンボクシングの方法を変更しました。これにより、バイトからintへの暗黙のキャストが発生し、データテーブルにあるため、バイトがボックス化されたときに古いFWが失敗しました。
ボックス化されていないバイトは4.5で暗黙的にintにキャストされますが、ボックス化されたバイトは暗黙的にキャストできないジェネリックオブジェクトです。
そうではありません。これは3.5SP1で変更されたため、SP1への更新が4.0更新に含まれていない限り、FW4.0も失敗するはずです。これはまだ答えられていません:)
これに関するMSからのチケットです;) https://connect.microsoft.com/VisualStudio/feedback/details/766887/casting-tinyint-from-sql-datarow-to-int-no-longer-possible