Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:Oracle数据类型与OracleDbType的等价性 情况:_C#_Oracle_Plsql_Types_Type Equivalence - Fatal编程技术网

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

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中。。。怎么知道 使用哪一个或它们都是 你想工作吗 以下是

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

问题:
  • 什么是等效的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。