C#:与OracleDbType的Oracle数据类型等价


情况:

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

问题:

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

  • 整数有三种类型
    OracleDbType中的(Int16,Int32,Int64)…如何知道使用哪一个或者是全部
    假设工作?


OracleDbType枚举的值在文档中定义。 阅读ODP for .NET Developer’s Guide 。

关于在Int16,Int32和Int64之间进行选择,它们都应该可以工作。 选择与.Net变量的预期大小匹配的那个:Int16表示-32768和32767之间的值,Int32表示-2147483648和2147483647之间的值,Int64表示更大的值。 似乎有一些与转换Ints和PL / SQL数据类型有关的funnies。 查看Mark Williams撰写的这篇博文 。

这是一种将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的链接 ,它们是您正在寻找的:根据枚举的名称,映射非常简单。

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

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

问题是如果你在NUMBER(38)列上调用GetInt64 ,即使值在正确的范围内,你也会得到一个例外…

NUMBER(1,0)=>布尔值

NUMBER(5,0)=> Int16.MaxValue == 32767

NUMBER(10,0)=> Int32.MaxValue == 2,147,483,647

NUMBER(19,0)=> Int64.MaxValue == 9,223,372,036,854,775,807

NUMBER(19,0)=> long.MaxValue == 9,223,372,036,854,775,807