哪个.NET数据类型最适合映射NHibernate中的NUMBER Oracle数据类型?
我见过一些例子,其中decimal
在NHibernate项目中用于映射到Oracle中的整数列。现在我在我的程序中使用了int
和long
。哪个.NET数据类型最适合映射NHibernate中的NUMBER Oracle数据类型?
decimal
优于int
/long
?它表现更好吗?
我见过小数代替INT /长在不同的例子。我只是想了解为什么
这可能是因为.NET decimal
和Oracle NUMBER
maps a bit better比long
和NUMBER
,同时也为您提供了更多的灵活性。如果您稍后在Oracle列中添加比例尺,那么如果您已使用decimal
,则不必更改数据类型。
decimal
肯定比int
和long
慢,因为后两者在硬件中得到支持。也就是说,你必须仔细研究一些大量的数据才能发挥作用。我仍然认为你应该使用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,77 5808 9,223,372,036,854,775,807
精度:18(19 ULONG)显著数字
甲骨文
defaultsNUMBER
38显著数字和刻度0(整数)。
类型:NUMBER
范围:+ - 1×10^-130至9.99 ...9×10^125
精度:38个显著数字
微软是意识到这个问题并且notes
此数据类型是用于 NUMBER(38)的数据类型的别名,并被设计为 ,以便OracleDataReader返回一个整数值的 System.Decimal或OracleNumber,而不是 。使用.NET 框架数据类型可能导致 溢出。
试想想它,你真正需要BigInteger
能够代表相同数量的显著数字至于什么NUMBER
默认。我从来没有见过任何人这样做,我认为这是非常罕见的需要。另外BigInteger
仍然不会削减它,因为NUMBER
可以是正面和负面的无限。
每天学习新东西:) – Phill 2011-04-04 10:15:41
//这让我感觉更多。感谢乔纳斯对这个伟大的解释......! – 2013-02-02 14:41:56
在pinch中,您可以随时使用映射到'Oracle.ManagedDataAccess.Types.OracleDecimal',如https://docs.oracle.com/cd/B28359_01/win.111/b28375/featTypes.htm中所示 - IIRC与Number (38)并处理+/- INF情况。 – quetzalcoatl 2017-10-23 13:16:55
[.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]
我不知道你从哪里拿过来,但这不是事实上发生的事情。从我看到的,'double'映射到'DOUBLE PRECISION','int'总是映射到'NUMBER(10,0)','decimal'可以映射到任何'NUMBER(x,y)',具体取决于'.Precision(x).Scale(y)'设置。顺便说一句,chaining'int'的'.Precision'不会改变映射 - 它仍然是'NUMBER(10,0)'。而且,这并不能回答我的问题。 – 2011-03-31 15:26:33
我使用'Devart',我读了下面的答案,描述了Oracle和.Net之间的CSDL映射类型.http://www.devart.com/forums/viewtopic.php?t=15604 – Homam 2011-03-31 15:29:58
但是我问了NHibernate。 .. – 2011-04-02 17:48:03
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
你说的意思是“什么是小数在INT的优势/长?它有更好的表现?”,小数并非如int /长... – Phill 2011-04-04 04:24:23
@Phill然而,十进制整数* * can **代表一个整数,我在各种例子中已经看到'decimal'而不是'int' /'long'。我只是想明白为什么。 – 2011-04-04 07:04:10