17

これがバグなのか、何か問題があるのか​​疑問に思います。

SQL Server 2008データベースから値を読み込んでいSqlDataReaderますが、特定の状況下では、SQL値を.net値に変換できません。(.NET 4.0)

私はそれを実際の問題を実証するテストケースまでたどりました:

実例:

"select convert(decimal(38, 19), 260000 ) as test"
rs.GetValue(1);
--> returns 260000 (decimal)

動作しない例:

"select convert(decimal(36, 26), 260000 ) as test"

rs.GetValue(1);
--> throws
   System.OverflowException: Conversion overflows.
   at System.Data.SqlClient.SqlBuffer.get_Decimal()
   at System.Data.SqlClient.SqlBuffer.get_Value()
   at System.Data.SqlClient.SqlDataReader.GetValueInternal(Int32 i)
   at System.Data.SqlClient.SqlDataReader.GetValues(Object[] values)

SQLServerが取得した実際の値を調べました。それらは、機能していないものが値を表すために4つの整数を使用し、機能しているものは3つだけを使用することとは異なります。

また、.net Reflectorを使用してソースコードを確認しました。これにより、値が3つを超える値が存在する場合に例外がスローされることが明らかになりましたが、その背後にあるメカニズムがわかりません。

ですから、これが.netFrameworkの真のバグであるかどうか疑問に思っています。

4

1 に答える 1

12

おそらく過度に正確であることを除けば、それはあなたが間違っていることではありません。それも新しい問題ではないと思います。

あなたはそれのバグ、または単に機能のギャップを主張することができます。.NetDecimal構造体は、SQL Serverに格納されている値を表すことができないdecimalため、OverflowExceptionがスローされます。

値を取得する前に、データベースで互換性のある値に操作する必要があります。または、生のバイナリ形式または文字列形式でデータを読み取り、.Net側で操作する必要があります。

または、それを処理する新しいタイプを作成することもできます。

decimal本当にその精度が必要でない限り、そもそも互換性のある定義を使用する方がおそらく簡単です。もしそうなら、私はその理由を知りたいと思います。

于 2012-07-04T10:39:51.663 に答える