C#:Oracle数据类型等效与OracleDbType(C#: Oracle Data Type

2019-08-19 18:12发布


情况:

我创建在C#中使用Oracle.DataAccess.Client(11克)做存储过程的Oracle数据库上的某些操作的应用程序。 据我所知,有一定的枚举(OracleDbType)包含Oracle数据类型,但我不知道一个用于某些类型的。

问题:

  • 什么是在OracleDbType枚举每个枚举类型等效的Oracle PL / SQL数据类型

  • 有三种类型的整数
    (Int16的,的Int32,Int64的)在OracleDbType ...如何知道使用哪一个或者是他们所有
    想与我们合作?


Answer 1:

所述OracleDbType枚举的值的文档中定义。 阅读对于.NET开发人员指南的ODP 。

至于Int16的,的Int32和Int64的之间做出选择,他们都应该工作。 选择符合你的.Net变量的预期大小的一个:-32768到32767之间的Int16的值,为的Int32 -2147483648和2147483647,以及Int64的任何东西之间的较大值。 似乎有与转换整数和PL / SQL数据类型一些连环画。 检查由马克·威廉姆斯这个博客帖子 。



Answer 2:

下面是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



Answer 3:

检查APC的链接时,他们是你在找什么:映射相当简单根据枚举的名称。

但是当你开始注意到,有一些棘手的约整数。 这里是我的映射:

  • Int16NUMBER(5)
  • Int32NUMBER(10)
  • Int64NUMBER(19)

问题是,如果你调用GetInt64一个NUMBER(38)列,你将得到一个例外,甚至如果该值是在正确的范围内...



Answer 4:

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



文章来源: C#: Oracle Data Type Equivalence with OracleDbType