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

时间:2009-10-17 20:43:10

标签: c# oracle plsql types type-equivalence


情况:

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

问题:

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

  • 整数有三种类型 (Int16,Int32,Int64)在OracleDbType中...怎么知道 哪一个使用或者都是 假设工作?


5 个答案:

答案 0 :(得分:22)

这是将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

答案 1 :(得分:13)

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

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

答案 2 :(得分:7)

检查APC's links,它们就是您要找的:根据枚举的名称,映射非常简单。

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

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

问题是,如果您在NUMBER(38)列上致电GetInt64,即使该值在正确的范围内,您也会收到异常...

答案 3 :(得分:1)

NUMBER(1,0)=&gt;布尔

NUMBER(5,0)=&gt; Int16.MaxValue == 32767

NUMBER(10,0)=&gt; Int32.MaxValue == 2,147,483,647

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

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

答案 4 :(得分:0)

对于那些想知道等效浮点数的人:

Decimal     Oracle NUMBER type
Double      8-byte FLOAT type

如果在oracle中使用Number,小数点就是使用的方法。

APC指出: https://docs.oracle.com/cd/B19306_01/win.102/b14307/OracleDbTypeEnumerationType.htm