web-dev-qa-db-fra.com

C #: équivalence de type de données Oracle avec OracleDbType


Situation:

Je crée une application en C # qui utilise Oracle.DataAccess.Client (11g) pour effectuer certaines opérations sur une base de données Oracle avec des procédures stockées. Je suis conscient qu'il existe une certaine énumération (OracleDbType) qui contient les types de données Oracle, mais je ne sais pas lequel utiliser pour certains types.

Des questions:

  • Quel est l'équivalent type de données Oracle PL/SQL pour chaque type énuméré dans énumération OracleDbType?

  • Il existe trois types d'entiers
    (Int16, Int32, Int64) dans OracleDbType ... comment savoir lequel utiliser ou sont-ils tous
    suppose de travailler?


20
Partial

Les valeurs de l'énumération OracleDbType sont définies dans la documentation. Lisez le Guide du développeur ODP pour .NET .

En ce qui concerne le choix entre Int16, Int32 et Int64, ils sont tous censés fonctionner. Choisissez celui qui correspond à la taille attendue de votre variable .Net: Int16 pour les valeurs comprises entre -32768 et 32767, Int32 pour les valeurs comprises entre -2147483648 et 2147483647 et Int64 pour tout ce qui est plus grand. Il semble y avoir quelques drôles liés à la conversion des types de données Ints et PL/SQL. Vérifiez ce billet de blog de Mark Williams .

15
APC

Voici une méthode pour convertir les types C # en OracleDbTypes les plus courants

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;
}

De plus, pour les très grandes valeurs de données de caractères, vous pouvez utiliser OracleDbType.Clob.

23
Charles Bretana

Vérifiez liens APC out, c'est ce que vous recherchez: le mappage est assez simple selon le nom de l'énumération.

Mais comme vous avez commencé à le remarquer, les entiers ont quelque chose de délicat. Voici ma cartographie:

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

Le fait est que si vous appelez GetInt64 sur une colonne NUMBER(38), vous obtiendrez une exception même si la valeur est dans la plage correcte ...

7
Mac

NUMBER (1,0) => Booléen

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

1
Carl Prothman

Pour ceux qui veulent connaître l'équivalent des virgules flottantes:

Decimal     Oracle NUMBER type
Double      8-byte FLOAT type

Décimal est la voie à suivre si vous avez utilisé Number dans Oracle.

Comme l'a souligné APC: https://docs.Oracle.com/cd/B19306_01/win.102/b14307/OracleDbTypeEnumerationType.htm

0
Sterling Diaz