0

我有一个 C# System.Double 属性,它可能包含类似 1e250 的值:

public virtual double DoubleValue {get; set;}

该属性映射到 BINARY_DOUBLE 列:

<property name="DoubleValue" column="VALUE_BINARY_DOUBLE"/>

Binary_Double 的最大值约为 1.7e+308(Oracle 文档),但出现异常:
ORA-01426:数字溢出

即使通过 SQL+ 执行查询也会出现问题。我必须使用 TO_BINARY_DOUBLE 强制转换才能使其工作。据我了解,提供的数字被隐式转换为 NUMBER:我的查询适用于 1e125(NUMBER 的最大值为 1e126),但不适用于 1e250。

我也尝试了这些映射,但没有成功:

<property name="DoubleValue" column="VALUE_BINARY_DOUBLE" type="System.Double"/>
<property name="DoubleValue" column="VALUE_BINARY_DOUBLE" type="binary"/>

使用:Oracle 11G - NHibernate 2.1.0 - .Net 3.5 SP1

感谢您提供的任何线索!

4

1 回答 1

0

这是我们正在使用的解决方法,因为我们没有找到任何解决方案:
在 C# 中添加一个属性:

public virtual string DatabaseDoubleValue
{
    get
    {
        return DoubleValue.ToString();
    }
    set
    {
        DoubleValue = double.Parse(value);
    }
}

将映射更改为

<property name="DatabaseDoubleValue" column="VALUE_BINARY_DOUBLE"/>

在 VALUE_BINARY_DOUBLE 列上添加触发器:

FOR EACH ROW
BEGIN
    :NEW.VALUE_BINARY_DOUBLE := TO_BINARY_DOUBLE(:NEW.VALUE_BINARY_DOUBLE);
END;

那样工作得很好!

于 2011-03-02T10:36:58.193 回答