哪种.NET数据类型最适合在NHibernate中映射NUMBER Oracle数据类型?

时间:2011-03-31 15:06:31

标签: c# oracle nhibernate oracle10g nhibernate-mapping

我见过一些例子,其中decimal在NHibernate项目中用于映射到Oracle中的整数列。现在我在我的程序中使用intlong

decimal优于int / long的优势是什么?它表现得更好吗?

3 个答案:

答案 0 :(得分:55)

  

我在各种示例中看到使用decimal而不是int / long。我只想了解原因

这可能是因为.NET decimal和Oracle NUMBER maps a bit better而不是longNUMBER,这也为您提供了更大的灵活性。如果您稍后在Oracle列中添加 scale ,那么如果您已使用decimal,则不必更改数据类型。

decimal肯定比intlong慢,因为硬件支持后两者。也就是说,你必须处理一些大量的数据才能有所作为。我仍然认为你应该使用long如果那是你正在处理的那个,那么你也应该让表列定义代表那个。 NUMBER(18,0) long等等。

decimal映射得更好的原因是long是64位而decimal是(种类)128位。

<强> .NET

  
    

键入:十进制
    近似范围:±1.0×10 ^ -28至±7.9×10 ^ 28
    精度:28-29位有效数字

         

输入:
    范围:-9,223,372,036,854,775,808至9,223,372,036,854,775,807
    精度:18(对于ulong为19)有效数字

  

<强>的Oracle

NUMBER defaults到38位有效数字,缩放0(整数)。

  
    

输入: NUMBER
    范围:+ - 1 x 10 ^ -130至9.99 ... 9 x 10 ^ 125
    精度:38位有效数字

  

Microsoft已发现此问题并notes

  

此数据类型是。的别名   NUMBER(38)数据类型,并且是专门设计的   以便OracleDataReader返回一个   而不是System.Decimal或OracleNumber   整数值。使用.NET   框架数据类型可以导致   溢出。

考虑到这一点,您实际上需要BigInteger能够表示与NUMBER默认的相同数量的有效数字。我从来没有见过有人这样做过,我认为这是一个非常罕见的需求。同样BigInteger仍然不会削减它,因为NUMBER可以是正无穷大。

答案 1 :(得分:38)

[.NET: Int32] = [Oracle:NUMBER(2)..NUMBER(9)*] 
[.NET: Int64] = [Oracle:NUMBER(10)..NUMBER(18)*]
[.NET: Double] = [Oracle:NUMBER(x, 0)..NUMBER(x, 15)*]
[.NET: Double] = [Oracle: FLOAT]
[.NET: Decimal] = [Oracle:NUMBER]  

答案 2 :(得分:12)

NUMBER(1,0)     => Boolean          
NUMBER(5,0)     => Int16/short.MaxValue == 32767    
NUMBER(10,0)    => Int32/int.MaxValue == 2,147,483,647    
NUMBER(19,0)    => Int64/long.MaxValue == 9,223,372,036,854,775,807