質問: 1 Select c.Field(Of Long)("COUNT") ``` "指定されたキャストは有効ではありません" System.Data.DataRowExtensions.UnboxT`1.ValueField(Object value) と例外が出ます ID,COUNT列共にNUMBER(10,0) NOT NULLでLong?である必要はないと思っていますが Long?にするとエラーにならないという話も聞きました また、検証環境と本番環境では本番環境のみ起きてしまいます (設定者は同じ環境と言い張りますが、実際は不明です・・) どのような理由が考えられるでしょうか ### 補足情報(言語/FW/ツール等のバージョンなど) .NET Framework 4 Client Profile Windows Server2012 R2 Oracle 12c Release 12.1.0.1.0 - 64bit
回答: 動作検証したわけではないですが、考えられることを書きます。 Oracleと.NETの型の対応↓を見ると、NUMBERに対応するのはLongでなくDecimalとなっています。 https://msdn.microsoft.com/ja-jp/library/cc716726(v=vs.110).aspx Decimal型にしてやるとキャストエラーにならないんじゃないかと予想します。 なんで桁の違いでキャストエラーになるんだよ!と思われるかもしれませんが、 DataAdapter.Fillで得られるDataTableでは、内部的に値をObject型で管理します。 DecimalやLongのような数値型とObject型との間で型変換が行われる際、 ボックス化/ボックス化解除という処理が行われるんですが、 このボックス化解除の際には元の正しい型を指定しないとキャストできないという ちょっと融通のきかない仕様なのです。 サンプルコードを書いて適当な値をDecimal→Object→Longの順にキャストしてみると エラーになるのを確認できると思います。 詳細は「ボックス化」「boxing」などで調べてみてください。