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

Par*_*ial 20 c# oracle types plsql type-equivalence


情况:

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

问题:

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


  • OracleDbType中有三种类型的整数(Int16,Int32,Int64)...如何知道使用哪一个或者它们都
    假设有效?


Cha*_*ana 24

这是一种将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;
}
Run Code Online (Sandbox Code Playgroud)

此外,对于非常大的字符数据值,您可能想要使用OracleDbType.Clob.

  • `byte - > OracleDbType.Byte`错了.当你使用这个`cmd.Parameters.Add("p1",OracleDbType.Byte,ParameterDirection.Input).Value = 129`时,Oracle DB会收到** - 127**.我偶然发现了这个.因此`OracleDbType.Byte`匹配`sbyte`.对于`bytes`值,你必须使用`OracleDbType.Int16`来覆盖0..255 (3认同)

APC*_*APC 15

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

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


Mac*_*Mac 7

检查APC的链接,它们是您正在寻找的:根据枚举的名称,映射非常简单.

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

  • Int16:NUMBER(5).
  • Int32:NUMBER(10).
  • Int64:NUMBER(19).

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