oracle的字段不小心存储了double.NaN导致nhibernate加载数据报illegal access to loading collection error错误问题

一、问题描述

发现请求某些数据时,会出现超时、报错现象。是通过NHibernate获取一个ORM对象时报错,报错信息为“illegal access to loading collection error”(非法访问加载数据集合错误)。这个ORM对象是个主表对象,里面映射了从表,一对多;然后从表又有一对多。难道是数据太多了?但又不是所有的数据都会报错,只集中在其中的若干条。

经过艰苦的调试,抽丝剥茧,发现又是Double类型字段中不小心保存了Double.NaN数据。从PL/SQL Develper上看,值为0,很普通,很正常;但其实,这带来了巨大的误导性。正是由于ORM对象试图绑定这些字段因为报错了。这种报错,像0除一样,直接将IIS的应用程序池宕掉。

二、解决方案

对于这种问题,目前我还没找到好的办法,先删掉问题数据。因为这些数据是系统运行过程中产生的,不是原始数据。同时修改产生数据的机制,对Double.NaN作防御,发现赋值是Double.NaN的话,就用0代替。

1、删掉问题数据

oracle表中,如果不小心存入了这种Double.NaN,真的很难发现,同时也很难通过什么检索条件将它找出来,什么 is nan,is NANVL(字段名,替换值),都不好使。不过,今天发现了,这个值无限逼近1,或许可以通过 >0.99999 and <1来筛选。这个9,喜欢写多少个就多少个。
在这里插入图片描述

2、预防插入Double.NaN值

//实体类
public class Check_Hl_Base_Zh  
{
    private double _DEVIATION_AVG;
    public virtual double DEVIATION_AVG
    {
        get
        {
            return _DEVIATION_AVG;
        }
        set
        {
            _DEVIATION_AVG = (value is Double.NaN) ? 0 : value;
        }
    }
	。。。
}

相关文章:
oracle字段存入NaN值后查询显示为0问题

posted on 2023-04-26 09:06  左直拳  阅读(0)  评论(0)    收藏  举报  来源

导航