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

Ily*_*gan 45 c# oracle nhibernate nhibernate-mapping oracle10g

我已经看到了一些decimal在NHibernate项目中使用的示例,用于映射到Oracle中的整数列.现在,我使用int,并long在我的计划.

decimalover int/ long?有什么好处?它表现更好吗?

Jon*_*röm 57

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

这可能是因为.NET decimal和Oracle NUMBER 映射好一点longNUMBER它也给你更大的灵活性.如果您稍后在Oracle列中添加一个比例,那么如果您已经使用过,则不必更改数据类型decimal.

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

decimal映射稍微好一点的原因long是64位并且decimal是(种)128位.

.净

类型:十进制
近似范围:±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(19 for ulong)有效数字

神谕

NUMBER 默认为38位有效数字,缩放0(整数).

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

微软意识到了这个问题和注意事项

此数据类型是用于NUMBER(38)的数据类型的别名,并且被设计为使得OracleDataReader返回System.Decimal或OracleNumber,而不是一个整数值.使用.NET Framework数据类型可能会导致溢出.

想想看,你实际上需要BigInteger能够表示与NUMBER默认值相同的有效位数.我从来没有见过有人这样做过,我认为这是一个非常罕见的需求.同样BigInteger仍然不会削减它,因为NUMBER可以是正无穷大.


Hom*_*mam 39

[.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]  
Run Code Online (Sandbox Code Playgroud)


Car*_*man 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    
Run Code Online (Sandbox Code Playgroud)