2012-07-04 16 views
8

これはバグかどうか、私は何か間違っていると思っています。SQL Serverから10進値を読み取るときのオーバーフロー例外

SQL Server 2008データベースからSqlDataReaderという値をロードしていますが、特定の状況でSQL値を.net値に変換できません。 (.NET 4.0)

私は、実際の問題を示してテストケースにそれをトレースしている

の作業例:

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

に動作していないexmaple:

"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) 

を私は、SQL Serverが撤回した実際の値を調べました。彼らは、非稼働のものが値を表現するために4つの整数を使用するという点が異なります。

さらに、値が存在すれば例外がスローされることを発表した.net Reflectorもソースコードをチェックしました。その後3つの値が、私はそれらの背後にある力学を理解していない。

これは、.NETフレームワークの本物のバグかどうか疑問に思っています。

+0

小数点精度の精度は28までです。リンクhttp://stackoverflow.com/questions/745270/c-sharp-sizeof-decimal – praveen

+0

でも、実際の例でも精度は高くなっています。 – Chuck

答えて

6

おそらくあまりにも正確であることを除いて、間違っていることはありません。私はそれがnew problem eitherとは思わない。

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

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

また、新しい型を記述することもできます。

本当にその精度が必要な場合を除き、互換性のあるdecimal定義を最初に使用する方が簡単でしょう。もしあなたが私が興味があるのなら、その理由を知ることができます。

+0

精度パラメータは、SQLサーバ自体によって選択されました。私はもともと、(10,2)と(10,4)フィールドの間でサーバー上でいくつかの基本的な計算を行っていました。戻り値の型としてサーバーが選択されました(36,26)。私は今すべてのフィールドを(18,4)に変更しました。 – Chuck

関連する問題