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

VB.NET Discussion :

Problème incompréhensible avec le type System.Guid !?


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Par défaut Problème incompréhensible avec le type System.Guid !?
    Bonjour,
    je m'arrache les cheveux sur une portion de code sans comprendre ce qu'il se passe. La situation : j'ai un Dataset typé contenant 1 table tblMembres qui contient 1 champ 'MembreID' de type System.Guid. Je parcours les lignes du Dataset pour construire une collection d'objets Membres. Voici la portion de code concernée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    If MyDataSet.tblMembres.Rows.Count > 0 Then
        For Each r As DataRow In MyDataSet.tblMembres.Rows
             Dim MyMembre As New Objects.Membre
             MyMembre.ID = CType(r("MembreID"), System.Guid)
             MyMembre.Adresse = r("Adresse").ToString
    [...]
    Je mets un BreakPoint après ces lignes et là, l'incompréhensible se produit :
    En passant le curseur sur MyMembre.ID, il m'est indiqué que la propriété vaut Empty. Or, dans l'Immediate Window, si je tape : "? MyMembre.ID.ToString", il m'affiche bien le Guid attendu !!! (Même chose en affichant via une msgBox.) Le reste des propriétés contient bien les données attendues (adresse, tel, etc...)
    Le problème c'est que cette propriété ne peut être vide et me lève donc des exceptions. Le problème se reproduit un peu plus loin, à chaque fois avec les propriétés de type Guid ! Et à chaque fois, dans l'Immediate Window, j'obtiens bien le Guid contenu dans ces propriétés !?
    Je deviens dingue à essayer de comprendre...

    J'ai pensé un moment que c'était la conversion Ctype(r("Classement"), System.Guid) qui posait problème mais, dans l'Immediate Window, si je tape : "? Ctype(r("Classement"), System.Guid).ToString, il m'affiche bien le Guid !
    Si, dans la fenêtre de code , je mets la souris sur "r", il m'affiche bien toutes les colonnes de la ligne concernée avec les bonnes données SAUF les colonnes de type Guid, qui sont Empty !!!

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Par défaut J'avance...
    J'ai testé autre chose :
    j'ai transformé la propriété ID de ma classe Membre, qui était de type System.Guid, en String. J'ai transformé le code en conséquence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MyMembre.ID = r("MembreID").ToString
    Et là, miracle ! La propriété ID contient bien le Guid (sous forme de string, donc). Cela ne m'éclaire pas sur le pourquoi : mon Dataset contient une colonne de type Guid, pourquoi ne puis-je pas l'affecter à une propriété de type Guid ???
    Je ne peux pas laisser la propriété en type String, car le problème se posera en sens inverse : lorsque je voudrai enregistrer un objet Membre dans le Dataset, je ne pourrai pas caster le type string en Guid !

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Par défaut
    Bon, après quelques recherches, il apparaitrait que le type System.Guid du framework soit fait uniquement pour générer des Guid, et non pas pour stocker des Guid externes. Bref, ça sert pas à grand chose... Mon problème semble donc insoluble : si je garde la colonne de ma base de données en UniqueIdentifier, je pourrai récupérer la valeur en vb, mais je ne pourrai pas faire l'inverse : enregistrer un guid de vb vers la base sql ; et vice-et-versa...
    Le mieux est donc de passer la colonne de ma base sql ET la propriété de ma classe en String.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Par défaut Oui, mais...
    La situation reste incompréhensible. Voici ma réflexion :
    Dans ma base de données SQL, la colonne MembreID est donc de type UniqueIdentifier. Or, dans le Dataset - généré via le concepteur de Dataset - la colonne MembreID se retrouve avec le type System.Guid. Et quand, en choisissant la table tblMembres de mon Dataset, je clique sur Preview Data, il m'affiche bien les Guid dans les colonnes correspondantes : donc l'IDE a bien généré un code pour caster le type UniqueIdentifier en System.Guid.
    J'ai donc jeté un oeil au code généré par le designer pour mon Dataset, pour voir comment il a déclaré le type en Guid. Quand il crée la colonne MembreID, la syntaxe est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Me.columnMembreID = New Global.System.Data.DataColumn("MembreID", GetType(Global.System.Guid), Nothing, Global.System.Data.MappingType.Element)
    Et là, lumière : je me suis dit, faisons comme lui ! Pour le type de ma propriété, au lieu d'indiquer System.Guid, indiquons GetType(System.Guid) : ce qui est refusé : 'keyword does not name a type'.
    Je sens que je m'approche de la solution, mais... comment faire ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Par défaut Je m'égare...
    En fait, mon problème n'est pas de définir correctement le type Guid. Mon problème est l'incohérence de l'IDE (cf mon 1er message) :
    Comment peut-il, d'un côté me dire que MyMembre.ID (de type System.Guid) est vide et de l'autre m'afficher le Guid via MyMembre.ID.ToString ?!!

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Par défaut Faites le test !
    La classe System.guid est décidément un mystère...
    Faites le test suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim test1 as System.Guid = System.Guid.NewGuid()
    Dim test2 as System.Guid
    test2 = test1
    Mettez un BreakPoint juste après ces 3 instructions et observez...
    Lorsque vous passez la souris sur test2, il vous met qu'elle contient...'Empty'
    Plus étrange, passez la souris sur test1, idem

    Dans l'Immediate Window, tapez :
    ? test1.ToString => le Guid s'affiche
    ? test2.ToString => le Guid s'affiche

    Que voilà un bien étrange comportement...
    Des explications ?
    Pour info je suis sous VS2008 ; framework 3.5 sp1

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Par défaut LA SOLUTION !
    Ouf ! Je n'ai trouvé de solution nulle part, mais, en regardant sur msdn les méthodes et constructeurs de cette ?*/!?* de classe Guid, je suis parvenu à trouver la solution pour gérer les Guid dans les 2 sens.
    La propriété ID de ma classe Membre, il faut la définir en tant que tableau de byte, soit Byte(). Pour récupérer le guid provenant du Dataset et l'affecter à la propriété ID de mon objet Membre, on utilise la méthode ToByteArray de la classe Guid :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MyMembre.ID = CType(r("MembreID"), System.Guid).ToByteArray
    Ensuite, pour obtenir le Guid à partir du tableau de byte (pour le comparer par exemple à un guid du Dataset), on utilise le constructeur approprié de la classe Guid :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim MonGuid = New Guid(MyMembre.ID)
    Et voilà. J'ai toujours trouvé sur internet des problèmes concernant la gestion tes types guid de sql en vb, sans jamais voir de solution autre que celle consistant à dire "n'utilisez pas les guid".
    Voici donc une solution qui pourra peut-être servir à d'autres !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème incompréhensible avec Eclipse et JSpinner
    Par esperal dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 20/11/2009, 12h40
  2. Clef de type System.Guid random
    Par BlAcKWiNgS027 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 04/08/2009, 21h52
  3. Problème incompréhensible avec XML
    Par poukill dans le forum C++
    Réponses: 5
    Dernier message: 18/07/2009, 06h36
  4. Réponses: 4
    Dernier message: 25/09/2006, 14h57
  5. Problème udpate avec un type Date
    Par kevinp dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 17/05/2006, 06h09

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