情况:
我创建在C#中使用Oracle.DataAccess.Client(11克)做存储过程的Oracle数据库上的某些操作的应用程序。 据我所知,有一定的枚举(OracleDbType)包含Oracle数据类型,但我不知道一个用于某些类型的。
问题:
所述OracleDbType枚举的值的文档中定义。 阅读对于.NET开发人员指南的ODP 。
至于Int16的,的Int32和Int64的之间做出选择,他们都应该工作。 选择符合你的.Net变量的预期大小的一个:-32768到32767之间的Int16的值,为的Int32 -2147483648和2147483647,以及Int64的任何东西之间的较大值。 似乎有与转换整数和PL / SQL数据类型一些连环画。 检查由马克·威廉姆斯这个博客帖子 。
下面是C#的类型转换为最常见的OracleDbTypes的方法
private static OracleDbType GetOracleDbType(object o)
{
if (o is string) return OracleDbType.Varchar2;
if (o is DateTime) return OracleDbType.Date;
if (o is Int64) return OracleDbType.Int64;
if (o is Int32) return OracleDbType.Int32;
if (o is Int16) return OracleDbType.Int16;
if (o is sbyte) return OracleDbType.Byte;
if (o is byte) return OracleDbType.Int16; -- <== unverified
if (o is decimal) return OracleDbType.Decimal;
if (o is float) return OracleDbType.Single;
if (o is double) return OracleDbType.Double;
if (o is byte[]) return OracleDbType.Blob;
return OracleDbType.Varchar2;
}
此外,对于非常大的字符数据值,您可能需要使用OracleDbType.Clob
。
检查APC的链接时,他们是你在找什么:映射相当简单根据枚举的名称。
但是当你开始注意到,有一些棘手的约整数。 这里是我的映射:
-
Int16
: NUMBER(5)
-
Int32
: NUMBER(10)
-
Int64
: NUMBER(19)
问题是,如果你调用GetInt64
一个NUMBER(38)
列,你将得到一个例外,甚至如果该值是在正确的范围内...
NUMBER(1,0)=>布尔
NUMBER(5,0)=> Int16.MaxValue == 32767
NUMBER(10,0)=> Int32.MaxValue == 2147483647
NUMBER(19,0)=> Int64.MaxValue == 9,223,372,036,854,775,807
NUMBER(19,0)=> long.MaxValue == 9,223,372,036,854,775,807