C#: Oracle Data Type Equivalence with OracleDbType

前端 未结 5 2308
广开言路
广开言路 2020-12-01 05:34

Situation:

I am creating an app in C# that uses Oracle.DataAccess.Client (11g) to do certain operations on a Oracle database with stored procedures. I am awa

相关标签:
5条回答
  • 2020-12-01 06:10

    NUMBER(1,0) => Boolean

    NUMBER(5,0) => Int16.MaxValue == 32767

    NUMBER(10,0) => Int32.MaxValue == 2,147,483,647

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

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

    0 讨论(0)
  • 2020-12-01 06:12

    For those who wants to know the equivalent of de floating points:

    Decimal     Oracle NUMBER type
    Double      8-byte FLOAT type
    

    Decimal is the way to go if you used Number in oracle.

    As APC pointed: https://docs.oracle.com/cd/B19306_01/win.102/b14307/OracleDbTypeEnumerationType.htm

    0 讨论(0)
  • 2020-12-01 06:14

    Check APC's links out, they are what you are looking for : the mapping is quite straightforward according to the name of the enumeration.

    But as you began to notice, there is something tricky about integers. Here is my mapping :

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

    The thing is that if you call GetInt64 on a NUMBER(38) column, you will get an exception even if the value is in the correct range...

    0 讨论(0)
  • 2020-12-01 06:20

    Here's a method to convert C# types to the most common 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;
    }
    

    Also, for very large character data values, you may want to use OracleDbType.Clob.

    0 讨论(0)
  • 2020-12-01 06:26

    The values of the OracleDbType Enumeration are defined in the documentation. Read the ODP for .NET Developer's Guide.

    With regards to choosing between Int16, Int32 and Int64, they are all supposed to work. Choose the one which matches the expected size of your .Net variable: Int16 for values between -32768 and 32767, Int32 for values between -2147483648 and 2147483647, and Int64 for anything larger. There appear to be some funnies relating to converting Ints and PL/SQL data types. Check this blog post by Mark Williams.

    0 讨论(0)
提交回复
热议问题