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

Linq Discussion :

DataSetTypé problèmes d'exceptions pour null avec LINQ.


Sujet :

Linq

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 34
    Par défaut DataSetTypé problèmes d'exceptions pour null avec LINQ.
    Bonjour,

    Actuellement j'utilise le DataSet généré à partir de ma table Sql Compact Edition. Tout marche pour le mieux pour un insert,un select basique. Maintenant je voudrai faire un formulaire de recherche donc avec des jointures entres tables.
    Je me suis tourné vers le linq et voici ma requéte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var results = from Chats in db.AsEnumerable()
    	                          join Personnes in dbpersonnes.AsEnumerable()
    	                              on Chats.Id_propriétaire equals Personnes.id into lien
    	                              where Chats.Nom == "tama"
    	                          from subPersonnes in lien.DefaultIfEmpty()
    	                          select new
    	                          {
    	                              Numero_puce = (Chats.Numero_Puce==null? "" : Chats.Numero_Puce),
    	                              Race = (Chats.Race==null?"":Chats.Race),
    	                              Couleur = (Chats.Couleur==null?"":Chats.Race),
    	                              Nom = Chats.Nom,
    	                              Telephone = (subPersonnes == null ? "" : subPersonnes.Telephone)	                          
    };
    Problème : le DataSet lève des exception quand la colonne est null (enfin pour etre exact DBnull). Or il semble ne pas vouloir dns le designer me mettre une string vide ou mettre null, je ne peu pas choisir autre chose que "throw exception".

    C'est un probléme connu il semblerai. J'ai trouver ce post: http://blog.evolvedsoftwarestudios.c...yped-datasets/
    Mais les solutions ne fonctionnent pas pour moi (ou en tout cas la modification de l'xml).

    Je pense devoir faire la jointure à la main. Actuellement je fait la recherche de cet facon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DataRow[] foundRows;
                foundRows = db.Select("Nom = 'toto'");
                DataTable dtselect = db.Clone();
                foreach (DataRow r in foundRows)
                {
                    dtselect.ImportRow(r);
                }
                chatsBindingSource1.DataSource = dtselect;
    Donc je pense faire un select dans le select si j'ai l'id qui n'est pas vide.

    Avez vous une solution pour le linq? ou alors une remarque sur mon select ou ma jointure manuel?
    Autre petite question, actuellement je code tout dans mon controlleur, la recherche , l'ajout... le mieux sa serrai de crée un classe chat.cs par exemple et faire des méthodes non? L'utilisation de classe est simple?

    Je débute encore en c# donc si vous avez des conseils je suis preneur.

  2. #2
    Membre Expert
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Par défaut
    Tu dis que Linq te lève une exception lorsque la colonne est nulle, mais ça te le fait sur toutes les colonnes ou seulement certaines ?

    Pour ta jointure manuelle, la seule chose que je dirais c'est : as-tu essayé de mettre directement en DataSource le tableau de DataRow résultant de ta requête ? Cela t'éviterais de devoir faire une boucle.
    A moins bien sûr que tu n'ai besoin de la définition de la table pour l'affichage.

    Quand à ta dernière question, oui il est certainement plus pratique de créer sa classe d'accès aux données qui n'a que ça en charge. Elle communiquera avec une classé métier ou l'interface afin de transmettre les données qui seront alors affichées.
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  3. #3
    Membre averti
    Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 34
    Par défaut
    Il lève une exception à partir du moment que j'utilise une colonne qui contient des DBnull. Dans mon exemple sur je retire Numero_puce je n'ai pas de probléme. C'est bien le dataset qui léve une exeption pas vraiment le LINQ. Car il ne connais pas DBnull donc léve une exeption et pas possible de changer dans mon datasetdesigner pour mettre un valeur.
    Voici un lien qui parle du probléme:
    http://blog.evolvedsoftwarestudios.c...yped-datasets/
    mais je n'ai pas trouver de solution correct.

    Pour la jointure manuel, justement les informations sont sur 2 tables, si le LINQ ne me permet pas de faire la jointure je vais devoir bouclé sur une table et faire la jointure moi même sur l'autre.

    Pour les classes je n'ai pas trouvé d'exemples (mais je n'ai pas énormément chercher je l'admet).

  4. #4
    Membre Expert
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Par défaut
    Pour ton premier problème, ne l'ayant jamais rencontré, je ne peux malheureusement pas faire plus.

    Pour la jointure, LINQ permet de le faire vu qu'il possède le mot clé join.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    from e1 in enumerable1
    join e2 in enumerable2 on e1.X equal e2.X
    select ...
    Pour la classe, recherche du côté des classes d'accès aux données aussi nommée DAL pour Data Access Layer ou DAO pour Data Access Object.
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  5. #5
    Membre averti
    Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 34
    Par défaut
    Bon j'ai rien dit, pour une raison X ou Y c'est bon la jointure maintenant. Surement que mon changement dans l'xml du datadesigner fonctionne finalement.
    Je vais voir pour les classes car c'est pas très propre pour l'instant. Merci de ton aide.


    edit: j'ai trouver quand l'exception se lève. Dans mon select (dans le linq) j'utilise des éléments de ma table personne. Quand j'ai un résultat qui ne possède pas de d'id de propriétaire il me léve une exception.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    voici le code (auto généré):
                public long Id_propriétaire {
                    get {
                        try {
                            return ((long)(this[this.tableChats.Id_propriétaireColumn]));
                        }
                        catch (global::System.InvalidCastException e) {
                            throw new global::System.Data.StrongTypingException("La valeur pour la colonne \'Id_propriétaire\' dans la table \'Chats\' est DBNull.", e);
                        }
                    }
                    set {
                        this[this.tableChats.Id_propriétaireColumn] = value;
                    }
                }
    edit: finalement j'en ai eu ras le bol et j'ai remplacer le throw il ne lance plus d'exceptions. Dommage de devoir le faire à la main (et le refaire s'il me recrée le fichier)

  6. #6
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    Il y a peut-être adns le designer une propriété informative sur la propriété de la classe que tu as modifié, permettant de régler ce genre de souci ? Comme pour définir la visibilité d'une classe ou d'une propriété ? Je dis ça comme ça, je n'ai pas manipulé avec les dataset.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 20/03/2013, 15h49
  2. Problème d'exception pour Struts 2
    Par informatica1989 dans le forum Java EE
    Réponses: 2
    Dernier message: 17/01/2012, 19h39
  3. Problème emplacement fichier pour écrire avec des flots
    Par fantomas261 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 14/09/2010, 02h05
  4. Problème d'exception dans Wicket avec CXF
    Par Nico87 dans le forum Services Web
    Réponses: 1
    Dernier message: 10/03/2010, 14h20
  5. Problème tuto silverlight et mysql avec Linq
    Par Goops dans le forum Silverlight
    Réponses: 3
    Dernier message: 26/05/2009, 16h57

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