Problème de paramètre ODP .NET avec le type de données uint

Après la mise à jour du fournisseur de données .NET oracle natif vers Oracles ODP.NET, j’ai rencontré le problème suivant.

J’ai une procédure stockée qui fait partie d’un package et accepte 32 parameters, tous IN sauf un, désigné comme paramètre OUT. Quoi qu’il en soit, voici le problème que j’ai. J’ai un paramètre de date passé en tant que varchar2 et 3 autres parameters qui sont varchar2 également. Pour le rest, ce sont tous des types NUMBER.

Dans mon code .NET, toutes les valeurs transmises à la procédure stockée sont soit une chaîne, soit un entier, à 4 exceptions près. J’ai 4 données de type UInt32. La valeur qu’ils détiennent est trop grande pour un int alors on a utilisé uint.

Voici le problème. Lorsque nous utilisions le fournisseur de données .NET oracle natif, le constructeur de parameters inclut un type de données OracleType.Number. Le constructeur de parameters oracle a désormais OracleDbType.Int32 et OracleDbType.Int64. Le type de données uint n’avait pas de problème lorsqu’il était défini comme valeur d’un paramètre de type de données OracleType.Number, mais maintenant, avec le nouveau client, j’obtiens des erreurs différentes selon les types de données que j’utilise.

(En passant, la procédure stockée fonctionne correctement lorsqu’elle est appelée avec les valeurs que je transmets. Ces exceptions se produisent toutes dans l’instruction ExecuteNonQuery d’une instance d’object de commande Oracle.)

J’ai changé le type de données contenant mes valeurs, ainsi que le type de données du paramètre, en utilisant les combinaisons suivantes. Voici les résultats de chacun.

Type de données .NET ‘ uint ‘ Type de données de paramètre ODP .NET ‘OracleDbType.Int32’ * System.OverflowException: la valeur était trop grande ou trop petite pour un Int32. à System.Convert.ToInt32 (valeur UInt32) à System.UInt32.System.IConvertible.ToInt32 (fournisseur IFormatProvider) à System.Convert.ToInt32 à Oracle.DataAccess.Client.OracleParameter.PreBind_Int32 () à Oracle .Client.OracleParameter.PreBind (Connecteur OracleConnection, IntPtr errCtx, Int32 arraySize) à Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery () à ScoutLoader.EventLoader.Load () *

Type de données .NET ‘ uint ‘ Type de données de paramètre ODP .NET ‘OracleDbType.Int64’ Oracle.DataAccess.Client.OracleException ORA-06502: PL / SQL: erreur de valeur ou numérique: erreur de conversion de caractère à numéro ORA-06512: à la ligne 1 de Oracle, dans le cadre de la procédure de vérification de la situation , IntPtr opsErrCtx, OpoSqlValCtx * pOpoSqlValCtx, Object src, Boolean bCheck) dans Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery () dans ScoutLoaderService.EventLoader.Load () *

Type de données .NET ‘ Int64 ‘ ODP. Type de données de paramètre ‘OracleDbType.Int64’ Oracle.DataAccess.Client.OracleException ORA-06502: PL / SQL: erreur de valeur ou numérique: erreur de conversion de caractère à numéro ORA-06512: à la ligne 1 de Oracle, dans le cadre de la procédure de vérification de la situation , IntPtr opsErrCtx, OpoSqlValCtx * pOpoSqlValCtx, Object src, Boolean bCheck) dans Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery () dans ScoutLoaderService.EventLoader.Load () *

Le problème qui en résulte n’a rien à voir avec les types de données. J’ai utilisé Int64 dans le paramètre Oracle et cela a fonctionné, mais seulement après avoir défini la propriété BindByName sur mon object Command sur true.

Apparemment, la valeur par défaut du fournisseur .NET System.Data.OracleClient est ‘BINDING BY NAME’, alors que celle par défaut pour Oracle.DataAccess est ‘BIND BY POSITION’.

Il aurait été intéressant que l’Exception Oracle interceptée contienne davantage d’informations, telles que le paramètre qui lève l’exception. Cela m’a peut-être aidé à découvrir le problème plus tôt.

Je pense que OracleDecimal est la voie à suivre ici, consultez Conversion de type de données ; même ici, ils mappent int34 à BINARY_INTEGER.

à propos, OracleDecimal est énorme et vous ne devriez pas rencontrer de problèmes

Voici une autre très bonne référence: OracleParameterClass . Pour les parameters de retour, OracleDbTypeEx peut être très utile.