我在C#中创建一个使用Oracle.DataAccess.Client(11g)的应用程序,用存储过程对Oracle数据库执行某些操作。我知道有一个包含Oracle数据类型的枚举(OracleDbType),但我不确定哪种类型可用于某些类型。
等效的 Oracle PL / SQL数据是什么 输入为每个枚举类型 OracleDbType枚举?
整数有三种类型 (Int16,Int32,Int64)在OracleDbType中...怎么知道 哪一个使用或者都是 假设工作?
答案 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,它们就是您要找的:根据枚举的名称,映射非常简单。
但是当你开始注意到,整数有些棘手。这是我的映射:
Int16
:NUMBER(5)
。Int32
:NUMBER(10)
。Int64
:NUMBER(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