NHibernate/Oracle:如何在 BINARY_DOUBLE 列中插入大数字?

发布于 2024-10-13 01:17:45 字数 875 浏览 3 评论 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

感谢您提供的任何指导!

I have a C# System.Double property which may contains value like 1e250 :

public virtual double DoubleValue {get; set;}

The property is mapped to a BINARY_DOUBLE column :

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

Max value for Binary_Double is about 1.7e+308 (Oracle doc), but I'm getting an exception :
ORA-01426 : numeric overflow

Problem appears even when executing a query through SQL+. I have to use the TO_BINARY_DOUBLE cast to make it work. In my understanding, the number supplied is implicitly converted to a NUMBER : my query work with 1e125 (max for NUMBER is 1e126) but won't work with 1e250.

I've also tried those mappings, without success :

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

Using : Oracle 11G - NHibernate 2.1.0 - .Net 3.5 SP1

Thanks for any lead you may provide !

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

等待我真够勒 2024-10-20 01:17:50

这是我们正在使用的解决方法,因为我们没有找到任何解决方案:
在 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;

这样工作正常!

Here is the workaround we are using, since we didn't find any solution :
Add a property in C# :

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

Change mapping to

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

Add a trigger on the VALUE_BINARY_DOUBLE column :

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

Works fine that way!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文