2017-02-01 8 views
0

dbに天びんを保存するストアドプロシージャがあります。SqlTruncateException:数値演算によって切り捨てが発生する

SqlTruncateException:数値計算は、切り捨てが発生し
今日は、例外が発生しました。

私たちは10億を超える残高を受け取ったため、この例外が発生しました。このような巨大な価値が間違っているかどうかは気にしませんが、SqlCientの奇妙な動作の理由を知りたいと思います。

public class LoroAccountBalance 
{ 
    ...  
    public decimal? Balance { get; set; } 
    ... 
} 

ユーザー定義テーブル型にマップされます:

create type Settlement.LoroBalanceType as table 
(
    ... 
    Balance      money    not null, 
    ... 
) 

だから、.NET decimalタイプがmoneyをSQLにマッピングされている

は、私たちは、残高のコレクションを渡します。

ここ

は、スタックトレースの最後のステップです:!

のSystem.Data.dll System.Data.SqlTypes.SqlDecimal.ConvertToPrecScale(System.Data.SqlTypes.SqlDecimal nは、int型の精度、int型のスケール)

SqlClientは、小数点精度を金型に変換する前に調整することを決めました。
しかし、この値はprecisionに対して選択され、1bは適合しません。

なぜ彼がそうしているのか理解したいと思います。 docsに説明が見つかりませんでした。

+0

どのようにして 'decimal'値をサーバーに渡しますか? – Luaan

+0

@Luan残高のコレクションをIDataReaderに変換し、タイプとして渡します。構造化 –

+0

ここで問題を特定したかどうかはわかります; –

答えて

1

スケールではなく精度ではないですか?失敗している正確な10進数を知っていますか? 10進数の後に4桁以上ある可能性はありますか? SQL Server MONEYは小数点の後に4桁しか持ちませんが、小数点にはその制限がありません。 https://msdn.microsoft.com/en-us/library/ms179882.aspx

+0

はい、元の値は2桁です。 –

+0

ポイント2桁 –

+0

私はテストする必要があります。いずれにしても約1bnの制限はないはずです。 –

関連する問題