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.
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?
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 .
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
.
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 ...
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
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