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

C# Discussion :

Intérêt des dataset typés?


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 7
    Par défaut Intérêt des dataset typés?
    Bonjour à tous,

    Je dois récupérer des infos ds un document XML, sachant que j'ai également l'XSD correspondant. L'utilisation que je dois faire de ces infos étant assez sensible, il faut que je m'assure de l'intégrité des données de l'XML, que je fasse un certain nombre de check et que "j'arrange" ces données pour une insertion en base.

    En réfléchissant à la façon de procéder, j'ai vu pas mal de choses sur les datasets typés, mais je n'arrive pas à comprendre l'intérêt de ces derniers, et à savoir si je peux m'en servir ou si ca reviendrait au même de passer par des datasets classiques.

    Auriez vs des conseils à me donner sur ce point SVP?

    Merci d'avance

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Un DataSet typé permet d'accéder aux données directement via des propriétés typées, plutôt que de passer par une chaine et de récupérer des données non typées (qu'il faudra caster pour les utiliser).

    Par exemple, avec un DataSet non typé, tu ferais quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    foreach (DataRow row in myDataSet.Tables["Products"].Rows)
    {
        int id = (int)row["ProductId"];
        string name = (string)row["ProductName"];
        ...
     
        row["ProductName"] = 42; // compilation OK, erreur à l'exécution
    }
    Avec un DataSet typé, tu pourrais faire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    foreach (ProductsRow row in myDataSet.Products)
    {
        int id = row.ProductId;
        string name = row.ProductName;
        ...
     
        row.ProductName = 42; // erreur à la compilation
    }
    Donc en résumé, les principaux avantages sont :
    - moins de casts, donc code plus court et plus clair
    - vérification à la compilation : si tu n'affectes pas la bonne valeur à un champ, ça pètera à la compilation plutôt qu'à l'exécution

  3. #3
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par mondeinfo Voir le message
    mais je n'arrive pas à comprendre l'intérêt de ces derniers,
    Tomlev a expliqué comment les utiliser, mais, pour ma part, je trouve au contraire que c'est un concept bancal qui crée un couplage fort entre accès données et objets métiers.

    Je ne suis pas favorable du tout à leur utilisation.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 7
    Par défaut
    Merci tomlev pour ces explications.

    Il est vrai que ça me faciliterait les choses autant au niveau du nombre de lignes de code, qu'au niveau de l'intégrité des données. Mais effectivement comme le note Bluedeep, le couplage métier/Données me gène.

    En conclusion je comprends mieux leur fonctionnement mais je ne les utiliserai pas.

    Merci à vous deux

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 7
    Par défaut
    J'ouvre à nouveau la discussion pour revenir sur les datasets.

    En utilisant un dataset non typé, toutes les valeurs stockées ds le dataset sont des "string" (exemple de commande : int i = (int)toto.Tables["tata"].Rows[0][2] me génère une erreur).
    Or j'aimerais justement que ces valeurs(toto.Tables["tata"].Rows[0][2]) soient du même type que les types spécifiés dans l'XML qui charge le dataset.
    Ce qui me permettrait ds mon code de faire des tests pour savoir si j'avais les bons types ds l'xml.
    En effet si ds l' XML les types entrées ne st pas conformes aux types de l'XSD =>je dois rejetter l'XML.

    Auriez vous des idées svp?

    Je sais que c'est pas tres clair mais evidemment je peux répondre a toutes les interrogations.

    Merci d'avance.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    En utilisant un dataset non typé, toutes les valeurs stockées ds le dataset sont des "string"
    Non, absolument pas. Les valeurs sont du type indiqué pour la colonne (DataColumn.DataType). Le type de retour de l'indexeur est object, parce qu'on ne connait pas statiquement le type, d'où l'intérêt des datasets typés.

    Mais en tous cas, que le dataset soit typé ou non, si tu essaies de mettre une valeur de type int dans un colonne de type string (ou inversement), ça plantera

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 7
    Par défaut
    Bonjour,

    Merci pour ta réponse tomlev.

    En fait je me suis peut être mal exprimé
    En fait ce qui se passe c'est que ds mon xsd j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xs:attribute name="monattribut" type="xs:double" use="required">
    dans l'xml j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <monelement ... monattribut="10.0000" .../>
    Cette ligne est contenu dans un fichier xml que je récupère grace a un dataset
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DataSet mondatatset= new DataSet()
    mondatatset.ReadXml("monxml.xml");;
    Lorsque j'essaye de récupérer la valeur contenue dans monattribut par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double toto = (double)rr.Tables[4].Rows[0][2];
    J'ai une erreur de cast. Or je ne voudrais avoir cette erreur que si mon xml contient autre chose qu'un double.

    Une idée SVP?

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Juste une idée... pas sûr que ça marche, mais tu peux essayer de charger le schema avant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DataSet mondatatset= new DataSet();
    mondatatset.ReadXmlSchema("schema.xsd");
    mondatatset.ReadXml("monxml.xml");

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 7
    Par défaut
    Merci Tomlev pour ta réponse, mais ca ne marche malheureusement pas

    Je pense que le problème vient du fait que dans les attributs les valeurs sont passées avec des "". et donc qd cette valeur est récupérée dans le dataset, ce dernier le voit comme un string.
    La question est comment faire la difference entre des véritables string et d'autres valeurs passées dans des " "?

    Une idée serait d'utiliser la fonction Replace mais je vois pas trop comment faire pour l'utiliser tout en gardant la structure de l'xml tel que le dataset me le permet.

    des idées SVP?

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par mondeinfo Voir le message
    En fait ce qui se passe c'est que ds mon xsd j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xs:attribute name="monattribut" type="xs:double" use="required">
    Euh, mais il est bizarre ton schema en fait
    Normalement dans un DataSet les valeurs sont stockées dans des éléments, pas dans des attributs.

    J'ai fait le petit test suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        DataSet ds = new DataSet("MyDataSet");
        DataTable dt = new DataTable("MyDataTable");
        dt.Columns.Add("Id", typeof(int));
        dt.Columns.Add("Name", typeof(string));
        dt.Columns.Add("Value", typeof(double));
        ds.Tables.Add(dt);
        var dr = dt.NewRow();
        dr["Id"] = 42;
        dr["Name"] = "Foo";
        dr["Value"] = 3.14159;
        dt.Rows.Add(dr);
        ds.WriteXml(@"E:\tmp\test_dataset.xml");
        ds.WriteXmlSchema(@"E:\tmp\test_schema.xsd");
    Le schéma généré est le suivant :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?xml version="1.0" standalone="yes"?>
    <xs:schema id="MyDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
      <xs:element name="MyDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
        <xs:complexType>
          <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="MyDataTable">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="Id" type="xs:int" minOccurs="0" />
                  <xs:element name="Name" type="xs:string" minOccurs="0" />
                  <xs:element name="Value" type="xs:double" minOccurs="0" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:choice>
        </xs:complexType>
      </xs:element>
    </xs:schema>

    Et le XML :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" standalone="yes"?>
    <MyDataSet>
      <MyDataTable>
        <Id>42</Id>
        <Name>Foo</Name>
        <Value>3.14159</Value>
      </MyDataTable>
    </MyDataSet>

    Quand j'essaie de le relire, ça fonctionne bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        DataSet ds = new DataSet();
        ds.ReadXmlSchema(@"E:\tmp\test_schema.xsd");
        ds.ReadXml(@"E:\tmp\test_dataset.xml");
        double value = (double)ds.Tables[0].Rows[0]["Value"];
    Par contre, si je supprime l'appel à ReadXmlSchema, j'ai la même erreur que toi sur la dernière ligne (InvalidCastException)

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 7
    Par défaut
    Euh, mais il est bizarre ton schema en fait
    Normalement dans un DataSet les valeurs sont stockées dans des éléments, pas dans des attributs.
    Je suis d'accord avec toi, mais c'est un fichier que l'on m'envoie tel quel,j'ai fait la remarque mais j'ai pas trop mon mot à dire dessus

    J'ai trouvé une parade, en fait comme je connais le type des données, je récupère la donnée dans un dataset et ensuite je parse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double toto= double.Parse(mondatarow["TOTO"].ToString());
    Comme ça si TOTO est entré comme un string par exemple dans l'XML ça plante.

    Voilà,

    Merci tomlev pour ton aide

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par mondeinfo Voir le message
    Je suis d'accord avec toi, mais c'est un fichier que l'on m'envoie tel quel,j'ai fait la remarque mais j'ai pas trop mon mot à dire dessus
    Ben ça correspond pas au schéma "normal" d'un dataset alors... et dans ces conditions, un dataset n'est sans doute pas la meilleure façon de le lire.

    A ta place j'utiliserais plutôt la sérialisation XML. Tu peux générer les classes qui vont bien à partir du schéma XSD, comme expliqué ici :
    http://tlevesque.developpez.com/dotn...lization/#LV-B

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 7
    Par défaut
    A ta place j'utiliserais plutôt la sérialisation XML. Tu peux générer les classes qui vont bien à partir du schéma XSD, comme expliqué ici :
    http://tlevesque.developpez.com/dotn...lization/#LV-B
    Bonjour,

    J'avais déja regardé ce tuto, et j'avais même généré les classes nécessaires, mais ça me paraissait être un arsenal assez compliqué pour la récupération des données, tandis qu'avec les datasets ça se faisait bien. Pour l'instant j'arrive à vérifier que les types des données entrées sont bien les bons grâce à du parsing.
    Les datelines étant assez serrées, je vais me contenter de ceci pour le moment en n'espérant ne pas avoir de mauvaise surprise.

    Merci pour ton aide

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

Discussions similaires

  1. Intérêt des DataSet
    Par jacklafrip dans le forum C#
    Réponses: 23
    Dernier message: 08/07/2011, 16h28
  2. Réponses: 6
    Dernier message: 23/11/2007, 12h18
  3. DataSet typé / Gestion des espaces sur clés
    Par sandre dans le forum Windows Forms
    Réponses: 8
    Dernier message: 17/09/2007, 10h07
  4. Réponses: 3
    Dernier message: 05/01/2007, 10h44
  5. [Technique] Intérêt des index
    Par ddams dans le forum Décisions SGBD
    Réponses: 10
    Dernier message: 04/11/2002, 15h11

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