IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

[c#] Séparateur décimal : problème dans un cas très particulier (via ManagedDataAccess en c#)


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 12
    Points : 5
    Points
    5
    Par défaut [c#] Séparateur décimal : problème dans un cas très particulier (via ManagedDataAccess en c#)
    Bonjour,

    J'ai un soucis très particulier avec le to_number.
    Le système sur lequel je travaille est sur une base Oracle. Le séparateur de décimal est le point, il en a toujours été ainsi.
    Donc les postes dev, utilisateurs et les serveurs sont configurés pour mettre le point.
    to_number('1.3') a toujours renvoyé 1.3 et to_number('1,3') a toujours renvoyé ORA-01722.
    D'autre part, on utilise une fonction maison "isnumeric" qui fait un to_number, qui renvoie 1 si ok et 0 sinon. Pareil, ça a toujours fonctionné.

    Il y a des résultats dans une table sous forme de varchar2. En général, il y a un nombre avec un point. Et régulièrement, il y a besoin de convertir cette valeur en décimal.

    PL/SQL, programmes en delphi, c#, crystal report, tout se passe bien, sauf dans 1 cas où un programme en c# n'obtient pas la donnée convertie.
    Exemple : j'ai '9.16'. que ce soit sur sql developper ou sql plus, to_number('9.16') renvoie 9.16.
    Or, quand je passe en debug en c#, je n'ai pas de valeur convertit, et si je rajoute un isnumeric('9.16'), cela renvoie 0.

    J'ai eu une idée. Dans ma fonction qui renvoie le résultat numérique final en partant du varchar2, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        -- xValeur et yValeur_transformee sont des varchar2
        if isnumeric(xValeur) = 0 then
          yValeur_transformee := replace(xValeur, '.', ','); 
        else
          yValeur_transformee := xValeur;
        end if;
    Et là, la fonction marche très bien partout.
    Mais je trouve ça pourri comme "patch".

    Quelqu'un a-t-il été confronté à ce problème ? Y a-t-il une manière plus "propre" de contourner ce problème ?
    Merci

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    La fonction to_number peut prendre deux paramètres supplémentaires :
    1. le format de la chaîne de caractères à convertir
    2. le paramétrage nls pour les séparateurs décimal et de milliers


    J'imagine que la fonction IsNumeric tente un to_number et sur exception "value error" renvoie 0.
    Rajouter ces deux paramètres dans votre fonction, vous n'aurez plus ce soucis.

    Regardez par exemple dans ce fil :
    https://www.developpez.net/forums/d1...a/#post8789550

  3. #3
    Futur Membre du Club
    Inscrit en
    Août 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Merci

    Oui, j'avais vu le to_number avec le format et le séparateur. Mais imposer le format à la conversion ne me semblait pas idéal.
    Après tout, par rapport à mon replace ('.', ',') avant de retenter un autre to_number, ce n'est pas plus moche.

    Dans la fonctions isnumeric, je ne cherche même pas le type d'erreur : when others then return 0.
    Parce que ça marche ou ça marche pas, cette seule information nous suffit.

    Je pensais qu'il y avait un paramétrage quelque part pour modifier le séparateur. C'est quand même curieux que tout fonctionne tout le temps et que dans ce cas-là, le séparateur soit une virgule.
    Quant à faire un alter session juste avant cette procédure, je n'ai même pas essayé tellement je trouvais ça dingue.

    Dorénavant, je vais utiliser le to_number(format, séparateur) quand le problème risque d'arriver, c'est à dire quand je passer par un appel en c# d'une procédure renvoyant des ref cursor.

    J'aurai bien aimé savoir si d'autres personnes ont été confrontées au même soucis. Je trouve ça trop bizarre !


  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Vous pouvez bien entendu modifier ce même paramètre au niveau de la session.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alter session set nls_numeric_characters='.,';
    Comme tous les paramètres NLS, leur attribution est complexe (mais définie) et dépend de plusieurs facteurs, je vous invite à chercher un peu sur le forum le sujet revenant régulièrement.

    L'intérêt de le positionner dans votre fonction IsNumeric c'est que ça fonctionnera quel que soit l'environnement appelant.

  5. #5
    Futur Membre du Club
    Inscrit en
    Août 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Un alter session dans isnumeric ?
    Bon, je n'aurai pas crû que c'était bien ! Pour moi, c'est comme si word devait contrôlait qu'on était bien en Français quand il voyait le mot vendredi !
    M'enfin si c'est la bonne pratique, je vais diffuser cette info autour de moi.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Ce n'est pas du tout ce que je voulais exprimer.
    De manière générale, on peut changer le paramètre nls_numeric_characters, entre autres, au niveau de la session.

    Le seul conseil que je vous donne c'est d'utiliser l'attribut nls_numeric_characters de la fonction to_number dans votre fonction IsNumeric.

  7. #7
    Futur Membre du Club
    Inscrit en
    Août 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Ah ok
    Dans mon cas, c'est un service windows qui lancer un exe c# qui lance des requêtes SQL, donc le changement du nls de la session, bof
    Mais oui, par contre, utiliser le NLS_NUMERIC_CHARACTERS dans le to_number peut convenir !

Discussions similaires

  1. Import fichier csv dans access (séparateur décimal = virgule)
    Par Averroes dans le forum Modélisation
    Réponses: 16
    Dernier message: 16/09/2007, 11h25
  2. Séparateur décimal dans une formule
    Par Tonton Phil dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 09/08/2007, 11h45
  3. [VB.NET]Problème de séparateur décimal [débutant]
    Par Cantalou dans le forum Windows Forms
    Réponses: 5
    Dernier message: 03/03/2006, 13h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo