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 :

Remplir une List<T>/un objet avec une DataTable.


Sujet :

C#

  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2013
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 14
    Points : 4
    Points
    4
    Par défaut Remplir une List<T>/un objet avec une DataTable.
    Bonjour,

    ceci étant mon premier message sur le forum j'espère qu'il sera assez détaillé !

    Je souhaite créer une application pour gérer le matériel de mon association.

    Je découpe mon code en 3 parties. La partie Data Access Layer permettant l'accès au données, la partie Client Layer avec une interface graphique de type console et la Business Layer avec les classes objets et les différentes méthodes.

    Ces 3 parties sont aussi découpées en projets et classes.

    Je vais maintenant vous présenter mon code ;

    Business Layer > Domaine contient les objets de mon projet.

    La classe matériel contient les informations de base sur le matériel, la classe Tuba contient les informations sur le tuba.
    Actuellement la classe Tuba ne contient pas de propriétés.

    Code : 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    public abstract class Materiel
    {
     private int id;
     private string code;
     private string nom;
     
            public int ID
            {
                get { return this.id; }
                set { this.id = value; }
            }
     
            public string Code
            {
                get { return this.code; }
                set { this.code = value; }
            }
     
            public string Nom
            {
                get { return this.nom; }
                set { this.nom = value; }
            }
     
     public Materiel(){}
     
     public Materiel(int idMateriel, string codeMateriel, string nomMateriel)
     {
      ID=idMateriel;
      Code=codeMateriel;
      Nom=nomMateriel;
     }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public sealed class Tuba : Materiel
    {
     public Tuba():base(){}
     
     public Tuba(int idTuba, string codeTuba, string nomTuba)
      :base(idTuba, codeTuba, nomTuba)
     {}
    }
    Business Layer > Service contient les méthodes de mon projet.

    La classe Service contient deux méthodes. La première sert a retourner les informations concernant l'ensemble des tubas.
    La seconde sert a retourner le tuba correspondant au code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public List<Materiel> GetAllTubas()
    {
     List<Materiel> ListMateriel = new List<Materiel>();
     
     
     
     foreach(DataRow row in dt.Rows)  //Le nom "dt" n'existe pas dans le contexte actuel
     {
      ListMateriel.Add(row["nom_materiel"]);
     }
     
     return ListMateriel;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public Materiel GetTubaByCode(string codeTuba)
    {
     Tuba TubaByCode = new Tuba();
     
     //...
     
     return TubaByCode();
     
    }
    Je ne sais malheureusement pas comment remplir mes objets avec ma DataTable !
    Cette partie du code n'est pas fonctionnelle du tout, je fait des tests...

    Data Access Layer > DataAccess

    La classe DataAccess permet la connexion à la base de données et contient une méthode retournant un DataTable.
    Actuellement ce morceau de code est en phase de test. Il fonctionne et retourne bien la valeur que je cherche : Tuba numéro 0001 = Tuba vert.
    Je me base sur une base de données déjà existante sous Oracle.

    Code : 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
    19
    20
    21
    22
    23
    24
    25
    public DataTable GetTubaDatabase(string codeTuba)
    {
     string oradb = "DataSource=databaseClubPlongee; User Id=user; Password=user;";
     OracleConnection conn = new OracleConnection(oradb);
     
     conn.Open();
     
     OracleCommand cmd = new OracleCommand();
     cmd.Connection = conn;
     cmd.CommandText = "select nom_tuba from tubaTable where code_tuba = '" + codeTuba +"'";
     cmd.CommandType = CommandType.Text;
     
     OracleDataAdapter da = new OracleDataAdapter(cmd);
     DataTable dt = new DataTable();
     
     da.Fill(dt);
     
     foreach(DataRow row in dt.Rows)
     {
      Console.WriteLine("Tuba numéro {0} = {1}", codeTuba, row["nom_tuba"]);
     }
     
     conn.Dispose();
     return dt;
    }
    Mais le découpage n'est pas correct!

    Je souhaite donc que mes deux méthodes de la classe Service (GetAllTubas et GetTubaByCode) utilisent la DataTable pour créer les différents objets et les retourner à la console.
    Je pense que je ne suis pas si loin de la solution mais je bloque.
    Avec le code actuel je ne peut retourner l'ensemble des tubas ! J'aimerais que si codeTuba est null/empty que ma DataTable se remplissent avec l'ensemble des tubas.

    Votre aide est vraiment la bienvenue, merci d'avance !

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    Dans ton cas il ne faut pas que tu passe par une datatable, tu dois utiliser le datareader pour créer tes objets 1 par 1 et tu les ajoutes à ta liste.
    Tu devrais trouver divers exemple sur la toile.

  3. #3
    Candidat au Club
    Inscrit en
    Octobre 2013
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    L'utilisation d'une DataTable me semblait plus performant vu le nombre d'enregistrement que je retourne.

    Comment faire pour retourner l'ensemble des tubas via ma List<Materiel> car ma requête ne permet pas d'avoir un null/empty. Je n'arrive pas non plus à résoudre ce problème !

    Merci d'avance !

  4. #4
    Candidat au Club
    Inscrit en
    Octobre 2013
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    J'ai modifié mon code !

    Code : 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    public DataTable GetTubaDatabase(string codeTuba)
    {
     string oradb = "DataSource=databaseClubPlongee; User Id=user; Password=user;";
     OracleConnection conn = new OracleConnection(oradb);
     
     conn.Open();
     
     OracleCommand cmd = new OracleCommand();
     cmd.Connection = conn;
     OracleDataAdapter da = new OracleDataAdapter(cmd);
     DataTable dt = new DataTable();
     
    if(string.IsNullOrEmpty(codeTuba))
    {
    	cmd.CommandText = "select nom_tuba from tubaTable";
    }
    else
    {
    	cmd.CommandText = "select nom_tuba from tubaTable where code_tuba = '" + codeTuba +"'";
    }
     
    cmd.CommandType = CommandType.Text;
    da.Fill(dt);
     
     
    foreach(DataRow row in dt.Rows)
    {
    	Console.WriteLine("Tuba numéro {0} = {1}", codeTuba, row["nom_tuba"]);
    }
     
    conn.Dispose();
    return dt;
     
    }
    Je souhaite maintenant utiliser le contenu de ma DataTable dt, pour créer mes différents objets. Comment procéder ?

    Merci d'avance

  5. #5
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    Déjà utilise les requêtes paramétrées : http://webman.developpez.com/article...ameter/csharp/
    Et utilises le datareader plutôt que la datatable, tu devrais avoir un code comme ça:
    Code : 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
            public List<Personne> ObtenirTous()
            {
     
                List<Personne> personnes = new List<Personne>();
                using (SqlCeConnection con = new SqlCeConnection(ConnectionString))
                {
                    string requete = "Select id, nom, prenom, datedenaissance, villedenaissance from personne";
     
                    SqlCeCommand commande = con.CreateCommand();
                    commande.CommandText = requete;
     
                    con.Open();
     
                    using (SqlCeDataReader rd = commande.ExecuteReader())
                    {
                        while (rd.Read())
                        {
                            Personne personne = RecupererPersonne(rd);
                            personnes.Add(personne);
                        }
                    }
                }
                return personnes.ToList();
            }
     
            private Personne RecupererPersonne(SqlCeDataReader reader)
            {
                Personne personne = new Personne();
     
                int indexColId = reader.GetOrdinal("id");
                if (!reader.IsDBNull(indexColId))
                {
                    personne.Id = reader.GetInt32(indexColId);
                }
     
                int indexColNom = reader.GetOrdinal("nom");
                if (!reader.IsDBNull(indexColNom))
                {
                    personne.Nom = reader.GetString(indexColNom);
                }
     
                int indexColPrenom = reader.GetOrdinal("prenom");
                if (!reader.IsDBNull(indexColPrenom))
                {
                    personne.Prenom = reader.GetString(indexColPrenom);
                }
                int
                    indexColDate = reader.GetOrdinal("datedenaissance");
                if (!reader.IsDBNull(indexColDate))
                {
                    personne.DateDeNaissance = reader.GetDateTime(indexColDate);
                }
     
                int indexColVille = reader.GetOrdinal("villedenaissance");
                if (!reader.IsDBNull(indexColVille))
                {
                    personne.VilleDeNaissance = reader.GetString(indexColVille);
                }
     
                return personne;
            }
    sauf que dans ton cas au lieu d'avoir un objet personne tu auras un objet materiel et au lieu des sqlce c'est du oracle que tu utilises: http://msdn.microsoft.com/fr-fr/libr...vs.110%29.aspx

  6. #6
    Candidat au Club
    Inscrit en
    Octobre 2013
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Merci de proposer ta solution, cependant je ne comprend pas encore totalement ton code, je débute.

    J'ai trouvé sur le net une solution qui pourrait m'aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public List<Materiel> GetAllTubas()
    {
     List<Materiel> ListMateriel = new List<Materiel>(); 
     
     foreach(DataRow row in dt.Rows)  //Le nom "dt" n'existe pas dans le contexte actuel
     {
    	var myListTuba = new Materiel();
    	myListTuba.Nom = row["nom_tuba"];
    	ListMateriel.Add(myListTuba);
     }
     
     return ListMateriel;
    }
    Cependant j'ai une erreur ligne 5 : Le nom "dt" n'existe pas dans le contexte actuel. Et je n'arrive pas à la résoudre.

  7. #7
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    Je ne comprends pas pourquoi tu veux absolument utiliser une datatable dans ton cas c'est rajouter une étape en plus inutile.
    C'est normal qu'il existe pas tu as oublié le morceau de code qui crée ton datable, ton objet dt tu ne l'a jamais crée.

  8. #8
    Candidat au Club
    Inscrit en
    Octobre 2013
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Je souhaite présenter mon programme ce soir aux membres du club. Mon niveau actuel en C# ne me permet pas d'utiliser ton code, je préfère comprendre que de recopier un code.
    J'espère que tu comprends.

    Sinon j'ai essayé ainsi :

    Code : 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
    public List<Materiel> GetAllTubas()
    {
     DataAccess.Oradb getListTubas = new DataAccess.Oradb();
     getListTubas.GetTubaDatabase(null);
     
     List<Materiel> ListMateriel = new List<Materiel>(); 
     
     foreach(DataRow row in dt.Rows)  //Le nom "dt" n'existe pas dans le contexte actuel
     {
    	var myListTuba = new Materiel();
    	myListTuba.Nom = row["nom_tuba"];
    	ListMateriel.Add(myListTuba);
     }
     
     return ListMateriel;
    }
    Mais l'erreur est encore présente. Je pense que je ne suis pas loin, mais la solution ne me saute pas aux yeux !

    Merci d'avance !

  9. #9
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Comme dit youtpout978 : Tu n'as pas crée ton objet "dt"...

    Et avec les exemples de youtpout978 tu as tous ce qu'il faut pour t'en sortir !

  10. #10
    Candidat au Club
    Inscrit en
    Octobre 2013
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Mon objet "dt" est pourtant bien créé car je peut voir ce qu'il contient avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach(DataRow row in dt.Rows)
    {
    	Console.WriteLine("Tuba numéro {0} = {1}", codeTuba, row["nom_tuba"]);
    }
    Ce code se trouve actuellement dans ma méthode GetCommuneData et fonctionne parfaitement!

    J'ai résolu mon erreur !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public List<Materiel> GetAllTubas()
    {
     DataAccess.Oradb getListTubas = new DataAccess.Oradb();
     DataTable dt = getListTubas.GetTubaDatabase(null);
     
     List<Materiel> ListMateriel = new List<Materiel>(); 
     
     foreach(DataRow row in dt.Rows)
     {
        Console.WriteLine("Tuba numéro {0} = {1}", codeTuba, row["nom_tuba"]);
     }
     
     return ListMateriel;
    }
    Je vais à présent remplir ma List avec le contenu de ma DataTable, je reviens vers vous si besoin !

    Merci encore

  11. #11
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    Bravo, si tu as le temps tu regarderas ce que je t'ai conseillé d'utiliser, ça te sera très utile surtout pour tes prochains dev.

  12. #12
    Candidat au Club
    Inscrit en
    Octobre 2013
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    J'ai fini l'ébauche de mon application, je regarde ton exemple, peut être très utile pour la version finale!

    Merci encore pour votre patience et votre aide !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/05/2011, 01h08
  2. inserer une liste de personne dans un champ d'une liste
    Par must19 dans le forum SharePoint
    Réponses: 1
    Dernier message: 02/09/2008, 10h12
  3. Réponses: 1
    Dernier message: 30/06/2008, 12h55
  4. Réponses: 7
    Dernier message: 28/06/2007, 11h08
  5. Réponses: 2
    Dernier message: 01/06/2007, 08h57

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