C#:Oracle数据类型与OracleDbType的等价性 情况:
我正在用C#创建一个应用程序,它使用Oracle.DataAccess.Client(11g)在Oracle数据库上使用存储过程执行某些操作。我知道有一个特定的枚举(OracleDbType)包含Oracle数据类型,但我不确定对某些类型使用哪个枚举 问题:C#:Oracle数据类型与OracleDbType的等价性 情况:,c#,oracle,plsql,types,type-equivalence,C#,Oracle,Plsql,Types,Type Equivalence,我正在用C#创建一个应用程序,它使用Oracle.DataAccess.Client(11g)在Oracle数据库上使用存储过程执行某些操作。我知道有一个特定的枚举(OracleDbType)包含Oracle数据类型,但我不确定对某些类型使用哪个枚举 问题: 什么是等效的Oracle PL/SQL数据 中的每个枚举类型的类型 OracleDbType枚举 整数有三种类型 (Int16、Int32、Int64)在OracleDbType中。。。怎么知道 使用哪一个或它们都是 你想工作吗 以下是
- 什么是等效的Oracle PL/SQL数据 中的每个枚举类型的类型 OracleDbType枚举
- 整数有三种类型
(Int16、Int32、Int64)在OracleDbType中。。。怎么知道 使用哪一个或它们都是
你想工作吗
以下是一种将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 GetOracleDbType(对象o)
{
如果(o为字符串),则返回OracleDbType.Varchar2;
如果(o是DateTime),则返回OracleDbType.Date;
如果(o为Int64),则返回OracleDbType.Int64;
如果(o为Int32),则返回OracleDbType.Int32;
如果(o为Int16),则返回OracleDbType.Int16;
如果(o是sbyte),则返回OracleDbType.Byte;
如果(o是字节)返回OracleDbType.Int16;--OracleDbType枚举的值在文档中定义。请阅读
关于在Int16、Int32和Int64之间进行选择,它们都应该有效。请选择一个与.Net变量的预期大小匹配的变量:Int16用于-32768和32767之间的值,Int32用于-2147483648和2147483647之间的值,Int64用于更大的值。转换Int似乎有一些有趣的地方和PL/SQL数据类型。检查。检查,它们就是您要查找的:根据枚举的名称,映射非常简单
但正如您开始注意到的,整数有一些棘手的地方。下面是我的映射:
Int16
:编号(5)
Int32
:编号(10)
Int64
:编号(19)
问题是,如果调用一个数字(38)
列,即使该值在正确的范围内,也会得到一个异常…数字(1,0)=>布尔值
数字(5,0)=>Int16.MaxValue==32767
数字(10,0)=>Int32.MaxValue==2147483647
数字(19,0)=>Int64.MaxValue==9223372036854775807
数字(19,0)=>long.MaxValue==9223372036854775807对于那些想知道反浮点等价物的人:
Decimal Oracle NUMBER type
Double 8-byte FLOAT type
如果在oracle中使用数字,十进制是一种方法
正如APC指出的那样:
Oracle PL/SQL数据类型。这里有两个“if(o是byte)”:)byte->OracleDbType.byte
是错误的。当你使用这个cmd.Parameters.Add(“p1”,OracleDbType.byte,ParameterDirection.Input).Value=129
然后Oracle DB接收到-127。我意外地发现了这一点。因此,OracleDbType.Byte
与sbyte
匹配。对于bytes
值,必须使用OracleDbType.Int16
才能覆盖0..255如果出现错误,请检查您是否按正确的顺序添加OracleParameters。这是必需的d、 即使这些都是命名参数。也可以将每个OracleParameter的.Direction显式设置为Input、Output或InputOutput。