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

Windows Forms Discussion :

DataSet typé / Gestion des espaces sur clés


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 92
    Points : 52
    Points
    52
    Par défaut DataSet typé / Gestion des espaces sur clés
    Bonjour.

    Je travaille sur une application C# utilisant des DataSet typés.

    Dans une DataTable de mon DataSet j'ai un champ clé (string).
    Mon DataSet et mon DataTable sont CaseSensitive (c'est obligatoire pour mon application).

    La valeur de la chaine pouvant être stockée dans ce champ clé doit également tenir compte des espaces à gauche et droite. C'est un particularité mas je ne peux faire autrement car ce champ doit stocker des noms de machines sur un réseau qui peut justement tout avoir comme combinaison.

    Mon problème est le suivant :
    Si j'ai une occurence avec en valeur de clé " TOTO" et une autre ayant "TOTO" dans mon DataTable pas de pb.
    Par contre si la différence est induite par un espace à droite (ex : "TOTO" et "TOTO ") j'ai là une violation de clé. A priori il un Ltrim() explicite qui est fait.

    Comment faire pour que "TOTO" et "TOTO " soient considérées comme des valeurs différentes dans un champ de mon DataTable ?

    Merci d'avance pour vos réponses.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 92
    Points : 52
    Points
    52
    Par défaut
    A priori mon problème provient de la gestion de la clé unique d'un dataset typé.

    C'est à dire que si j'ai 2 occurences différentes ayant en valeur "TOTO" et "TOTO " dans leur clé primaire cela provoque une violation de clé.

    Pourtant la valeur n'est pas la même.

    J'ai d'ailleurs interrogé une données "TOTO " qui est passée de l'état stockée dans une variable puis affecté à un champ d'un Datatable puis lu à partir de ce champ dans une variable et je n'ai pas perdu ces espaces à droite durant toutes ces opérations. Cela signifie donc que c'est vraiment la gestion des clé uniques qui refuse de différencier ces valeurs sur leurs espaces à droite.

    Est-il possible de configurer ce comportement de gestion de clé unique dans un dataset ?

  3. #3
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    Si le framework fait un Trim de ta clé automatiquement, à toi de le tromper. Soit en ajoutant un caractère au début et à la fin de ta chaine (a toi d'évaluer si ta clé risque d'être double due à la probabilité que ces caractères soient utilisés) ou alors de transformer ta clé en md5 ou base64.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 92
    Points : 52
    Points
    52
    Par défaut
    c'est une bonne idée (l'ajout du caractère à gauche et droite pour encadrer ma chaine) mais cela va être lourd à implémenter dans mon appli.

    N'y a t-il pas possibilité de configurer la règle de gestion de clé en lui disant de ne pas faire ce trim() ?

  5. #5
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    Citation Envoyé par sandre Voir le message
    c'est une bonne idée (l'ajout du caractère à gauche et droite pour encadrer ma chaine) mais cela va être lourd à implémenter dans mon appli.
    Pas tant que çà! Si tu dérives de DataTable et change la façon dont la clé est interprétée?

    Citation Envoyé par sandre Voir le message
    N'y a t-il pas possibilité de configurer la règle de gestion de clé en lui disant de ne pas faire ce trim() ?
    Je n'en sais rien, n'utilisant jamais les DataTable, mais pourrais tu me mettre un morceau de code ou tu utilises ton DataTable et ta clé pour chercher plus profondément d'ou vient le problème?

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 92
    Points : 52
    Points
    52
    Par défaut
    En fait je ne vois pas quoi te mettre comme bout de code.

    Si tu veux c'est simplement quand j'ajoute une occurence ayant par exemple "TOTO " en valeur dans le champ clé à un datatable ayant une occurence qui a "TOTO" dans son champ clé. C'est vraiment que la gestion des clés uniques ne tient pas compte de ces espaces dans son algo de comparaison de valeur.

    C'est par exemple la ligne : this.Rows.Add(row); qui provoque l'exception.

  7. #7
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    Afin de pouvoir bien rechercher montre moi comment tu construit l'objet row. Et si tu as la stack trace c'est encore mieux.

    (fin des réponses à 17h, boulot finit, départ w-e, pas d'ordinateur avant lundi )

    EDIT: ok, je reproduit l'erreur, je sais par ou chercher.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 92
    Points : 52
    Points
    52
    Par défaut
    En fait je viens de me faire une méthode AjouterTagsChampCle() et une autre RetirerTagsChanmCle() chargées de convertir "TOTO " en "*TOTO *" et inversement.

    Du coup j'appelle ces méthodes avant sauvegarde dans mon datatable et avant lecture dans celui-ci et c'est parfait !

    Je te remercie pour ton aide, j'avais vraiment pas pensé à entourer les infos avec espaces !

  9. #9
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    Ce qui est vraiment dommage, c'est qu'on ne puisse pas overrider Item[string] de DataRow

Discussions similaires

  1. [WD-2013] Gestion des espaces sur les cotés d'un objet mathtype
    Par bendesarts dans le forum Word
    Réponses: 3
    Dernier message: 24/08/2014, 23h12
  2. [2D] Gestion des sprites sur un moteur 2d
    Par drcd dans le forum Développement 2D, 3D et Jeux
    Réponses: 9
    Dernier message: 27/03/2006, 16h17
  3. [VBS] Gestion des espaces dans le chemin de fichiers
    Par Edoxituz dans le forum VBScript
    Réponses: 4
    Dernier message: 23/02/2006, 16h41
  4. Réponses: 4
    Dernier message: 25/11/2005, 18h15
  5. Application de gestion des sms sur PC
    Par andyvo dans le forum Langage
    Réponses: 9
    Dernier message: 20/10/2005, 23h49

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