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

问题描述:

我见过一些例子,其中decimal在NHibernate项目中用于映射到Oracle中的整数列。现在我在我的程序中使用了intlong哪个.NET数据类型最适合映射NHibernate中的NUMBER Oracle数据类型?

decimal优于int/long?它表现更好吗?

+0

你说的意思是“什么是小数在INT的优势/长?它有更好的表现?”,小数并非如int /长... – Phill 2011-04-04 04:24:23

+0

@Phill然而,十进制整数* * can **代表一个整数,我在各种例子中已经看到'decimal'而不是'int' /'long'。我只是想明白为什么。 – 2011-04-04 07:04:10

我见过小数代替INT /长在不同的例子。我只是想了解为什么

这可能是因为.NET decimal和Oracle NUMBERmaps a bit betterlongNUMBER,同时也为您提供了更多的灵活性。如果您稍后在Oracle列中添加比例尺,那么如果您已使用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,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可以是正面和负面的无限。

+0

每天学习新东西:) – Phill 2011-04-04 10:15:41

+0

//这让我感觉更多。感谢乔纳斯对这个伟大的解释......! – 2013-02-02 14:41:56

+0

在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] 
+1

我不知道你从哪里拿过来,但这不是事实上发生的事情。从我看到的,'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

+0

我使用'Devart',我读了下面的答案,描述了Oracle和.Net之间的CSDL映射类型.http://www.devart.com/forums/viewtopic.php?t=15604 – Homam 2011-03-31 15:29:58

+2

但是我问了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