4

高精度の 10 進数値を使用する必要があります。たとえば、SQL Server 2012では最大 38 桁まで使用できます

これは、System.Decimalサポートされている精度 (有効桁数 28 ~ 29 桁) よりも高くなっています。

BigDecimal必要なコンストラクター (数値の文字列表現など) をサポートする CLR 側でこれを表すために、特定の実装を使用するとします。

decimal値は、適切な SQL Serverタイプを使用して SQL Server データベースに格納されます。

ORMにNHibernateを使用しています。IUserTypeDB表現から表現に変換する実装を作成しようとしていますBigDecimal

System.Decimal私の問題は、データを切り捨てる中間体を使用しないと、これを行う方法がわからないことです。

public virtual object NullSafeGet(IDataReader rs, string[] names, object owner)
{
    // ??
    object objValue = NHibernateUtil.Decimal.NullSafeGet(rs, names[0]);
    //objValue is already a System.Decimal

    if (!Convert.IsDBNull(objValue))
    {
        return new BigDecimal(objValue.ToString());
    }
    return null;
}

アップデート: 

対応する Java では、この正確なユース ケースに対応する特別な Hibernate DbType を確認できます。org.hibernate.type.BigDecimalType

これが基盤となる ADO.NET レイヤーの制限なのかどうか疑問に思い始めています。また、m ユース ケースに適した定義もありません。DbType

4

1 に答える 1

1

NHibernateUtil.Decimal.NullSafeGet() を呼び出す必要はありません。代わりに、IDataReader で使用可能なメソッドを使用して値を取得する必要があります。

たとえば、リーダーで GetValue() を使用すると、タイプ マッピング テーブルによって、 System.Data.SqlTypes.SqlDecimalのインスタンスを取得するように見えます。

次に、値を BigDecimal に変換する方法を理解する必要があります。

于 2013-01-19T09:20:07.220 に答える