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 un DataGridView à partir d'un SqlDataReader


Sujet :

C#

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2019
    Messages : 24
    Points : 8
    Points
    8
    Par défaut remplir un DataGridView à partir d'un SqlDataReader
    Bonjour,

    Je débute en C# et je rencontre une difficulté en essayant de remplir une table (DataGridView) à partir des résultats d'une requête (SqlDataReader), sans utiliser de DataSource :

    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Data.SqlClient;
     
    namespace TestAffichageDonneesDivalto
    {
        public partial class COMMANDE_LISTE : Form
        {
            public COMMANDE_LISTE()
            {
                InitializeComponent();
            }
     
     
     
            private void COMMANDE_LISTE_Load(object sender, EventArgs e)
            {
                // Déclaration des variables
                string          strConnexion;
                string          strRequete;
                SqlConnection   oConnection;
                SqlCommand      oCommand;
                SqlDataReader   oReader;
                DataGridViewRow LigneInseree;
     
                // Création des colonnes de la table
                TableCommandesClient.Columns.Add("PIDT", "Date");
                TableCommandesClient.Columns.Add("PINO", "Pièce no");
                TableCommandesClient.Columns.Add("CE4", "Etat");
     
                // Chaîne de connection à la base de données
                strConnexion = "Data Source=SRVDIVALTO2;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False; database=ERPASPTEST";
                // Requête de sélection des commandes clients
                strRequete = "SELECT ENT.PIDT AS Date, ENT.PINO As 'Pièce no', ENT.CE4 AS 'Etat' from ENT where ENT.TICOD='C' AND ENT.PICOD=2";
     
                try
                {
                    // Initialisation de la connexion à la base de données
                    oConnection = new SqlConnection(strConnexion);
                    // Création de l'objet commande qui permettra d'exécuter la requête
                    oCommand = new SqlCommand(strRequete, oConnection);
                    // Ouverture de la connexion à la base de données
                    oConnection.Open();
                    // Exécution de la requête de sélection des commandes client
                    oReader = oCommand.ExecuteReader();
                    do
                    {
                        while (oReader.Read())
                        {
                            // ajout de la commande client dans la table
                            LigneInseree = new DataGridViewRow();//(DataGridViewRow)TableCommandesClient.RowTemplate.Clone();
                            LigneInseree.Cells[0].Value = oReader[1];
                            LigneInseree.Cells[1].Value = oReader[2];
                            LigneInseree.Cells[2].Value = oReader[3];
                            TableCommandesClient.Rows.Add(LigneInseree);
                        }
                    }
                    while (oReader.NextResult());
                    // Fermeture du DataReader
                    oReader.Close();
                    // Fermeture de la connexion
                    oConnection.Close();
     
                }
                catch (Exception MonException)
                {
                    Console.WriteLine("L'erreur suivante a été rencontrée :" + MonException.Message);
                }       
     
            }
        }
    }
    La table n'est pas remplie, et j'ai l'exception "L'index était hors limites.Il ne doit pas être négatif et doit être inférieur à la taille de la collection.". Il y a des milliers de résultats normalement.

    Pouvez-vous m'aider à comprendre cette erreur s'il vous plaît?

    Alexandre

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2019
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    J'ai l'impression qu'il faudrait que j'indique quelque part le nombre de colonnes lors de la création de la ligne, mais je ne sais pas comment.

    Précisions :
    La première colonne est une date sans heure
    La deuxième colonne est un entier
    La troisième colonne est un caractère
    Le DataGridView présent dans le concepteur est vide, les colonnes sont ajoutées par programmation (pourquoi çà? Juste pour apprendre à manipuler le contrôle par programmation)

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Février 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Février 2009
    Messages : 155
    Points : 231
    Points
    231
    Par défaut
    Crée des colonnes avec la propriété DataGridView.ColumnCount.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2019
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Merci Krantz.

    Entre temps j'ai aussi trouvé cette solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LigneInseree.CreateCells(TableCommandesClient);
    Juste après LigneInseree = new DataGridViewRow();.

    Je ne sais pas quelle méthode est la meilleure, mais çà fonctionne

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2019
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Finalement j'ai essayé d'améliorer le résultat pour que le nom de rubriques ne soit pas figé :

    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Data.SqlClient;
     
    namespace TestAffichageDonneesDivalto
    {
        public partial class COMMANDE_LISTE : Form
        {
            public COMMANDE_LISTE()
            {
                InitializeComponent();
            }
     
     
     
            private void COMMANDE_LISTE_Load(object sender, EventArgs e)
            {
     
                // Déclaration des variables
                string strConnexion;
                string strRequete;
                SqlConnection oConnection;
                SqlCommand oCommand;
                SqlDataReader oReader;
                DataGridViewColumn ColonneInseree;
                DataGridViewRow LigneInseree;
                DataTable schemaTable;
     
                // Chaîne de connection à la base de données
                strConnexion = "Data Source=SRVDIVALTO2;Initial Catalog=ERPASPTEST;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False; database=ERPASPTEST";
                // Requête de sélection des commandes clients
                strRequete = "SELECT ENT.PIDT As 'Date', ENT.PINO As 'Pièce no', ENT.CE4 AS 'Etat' from ENT where ENT.TICOD='C' AND ENT.PICOD=2";
     
                try
                {
                    // Initialisation de la connexion à la base de données
                    oConnection = new SqlConnection(strConnexion);
                    // Création de l'objet commande qui permettra d'exécuter la requête
                    oCommand = new SqlCommand(strRequete, oConnection);
                    // Ouverture de la connexion à la base de données
                    oConnection.Open();
                    // Exécution de la requête de sélection des commandes client
                    oReader = oCommand.ExecuteReader();
     
                    // On récupère les informations sur le schéma de la colonne dans la base
                    schemaTable = oReader.GetSchemaTable();
     
                    // Pour chaque rubrique de la requête
                    foreach (DataRow myField in schemaTable.Rows)
                    {
                        // On crée la colonne correspondante
                        ColonneInseree = new DataGridViewColumn();
                        ColonneInseree.Name = myField[schemaTable.Columns[0]].ToString();
                        ColonneInseree.HeaderText = myField[schemaTable.Columns[0]].ToString();
                        ColonneInseree.CellTemplate = new DataGridViewTextBoxCell();
                        ColonneInseree.ValueType = myField[schemaTable.Columns[12]].GetType();
                        TableCommandesClient.Columns.Add(ColonneInseree);
                    }
     
                    do
                    {
                        while (oReader.Read())
                        {
                            // ajout de la commande client dans la table
                            LigneInseree = new DataGridViewRow();//(DataGridViewRow)TableCommandesClient.RowTemplate.Clone();
                            LigneInseree.CreateCells(TableCommandesClient);
                            for (int i = 0; i < TableCommandesClient.ColumnCount ; i++)
                            {
                                LigneInseree.Cells[i].Value = oReader[i];
                            }
                            TableCommandesClient.Rows.Add(LigneInseree);
                        }
                    }
                    while (oReader.NextResult());
                    // Fermeture du DataReader
                    oReader.Close();
                    // Fermeture de la connexion
                    oConnection.Close();
     
                }
                catch (Exception MonException)
                {
                    Console.WriteLine("L'erreur suivante a été rencontrée :" + MonException.Message);
                }
     
            }
     
     
        }
    }
    Par contre, en plus des alias des rubriques (destiné à leur affichage dans les en-têtes de colonnes), j'aimerais obtenir le nom de la rubrique dans la base, est-ce possible ???

    Est-ce qu'un remplissage similaire avec un DataSource serait plus performant? Je ne sais pas mesurer çà

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    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 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Bonjour,

    en faite le mieux dans ce cas n'est pas de remplir le datagrid met de creer une liste d'objet que vous remplirez avec le résultat de votre requete et ensuite c'est cette liste qui sera la datasource de votre datagridview
    tu as un exemple ici https://www.codeproject.com/Articles...-from-SqlDataR
    ou un autre ici https://www.aspforums.net/Threads/16...g-C-in-ASPNet/

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2019
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par youtpout978 Voir le message
    Bonjour,

    en faite le mieux dans ce cas n'est pas de remplir le datagrid met de creer une liste d'objet que vous remplirez avec le résultat de votre requete et ensuite c'est cette liste qui sera la datasource de votre datagridview
    tu as un exemple ici https://www.codeproject.com/Articles...-from-SqlDataR
    ou un autre ici https://www.aspforums.net/Threads/16...g-C-in-ASPNet/
    Bonjour,

    merci, c'est très intéressant. Je crois que dans un premier temps, pour m'approprier le fonctionnement, je vais essayer avec des entités moins riches que des commandes pour débuter, car de nombreux membres seront d'autres listes d'objets dans lesquelles il s'agira d'effectuer une sélection. Exemple : la colonne l'état ne devra pas afficher 8, mais une combo avec des valeurs d'un autre fichier.

    Quel outil me conseillerais-tu pour créer automatiquement les classes telles que employé ou commande à partir des rubriques de la table de la base de données s'il te plaît? C'est peut-être déjà inclu dans Visual Studio, mais je ne me suis pas encore approprié toutes les fonctionnalités.

    Peut-être que cette extension est faite pour ça : https://marketplace.visualstudio.com...ePOCOGenerator

  8. #8
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    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 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Je t'avoue les écrire à la main en fonction de ce que j'ai en base de donnée, tu peux déjà t’entraîner avec ta première requête qui renvoie que 3 propriétés.

    Après il y a la solution entity framework qui fait le mappage automatiquement, et te permet d'écrire tes requêtes en linq directement, ça te permet de coder plus rapidement, mais tu peux avoir des problèmes de perf et des problèmes de migration quand vous êtes plusieurs sur le même projet en code first.
    https://docs.microsoft.com/en-us/ef/#pivot=entityfmwk

    J'utilise Dapper actuellement sur un projet perso, m'évitant de faire le mapping à la main mais je doit quand même faire les classes à la main et écrire les requêtes mais tu te fais plus chier à écrire reader.get ... pour chaque colonne.
    https://dapper-tutorial.net/query

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2019
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Justement je suis en train d'essayer Entity Framework 6, qui m'a généré un unique fichier .cs avec énormément de classes partielles dedans, quand je m'attendais à avoir un fichier .cs avec une classe par entité, avec un ou plusieurs constructeurs pour chacune.

    Aucune association entre les tables n'a été détectée. C'est certainement lié à la conception de la base, mais je dois faire avec, sans la modifier.

    J'ai essayé de renommer l'entité ENT en EntetePiece (pour que ce soit plus parlant) en gardant le mappage avec ENT, puis de créer une association entre la rubrique ENT.ETB et ETS.ETB dans le diagramme pour voir le résultat sur la classe, que voici :

    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
    namespace TestAffichageDonneesDivalto.Modele
    {
        using System;
        using System.Collections.Generic;
     
        public partial class EntetePiece
        {
            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
            public EntetePiece()
            {
                this.ETS = new HashSet<ETS>();
            }
     
            public int ENT_ID { get; set; }
            public string CE1 { get; set; }
            public string CE2 { get; set; }
            public string CE3 { get; set; }
            public string CE4 { get; set; }
            public string CE5 { get; set; }
            public string CE6 { get; set; }
            .....
    }
    Je vais faire des recherches pour comprendre ce qu'est un hashset et si c'est correct.

    Je dois aussi regarder comment renommer une propriété tout en conservant le mappage avec la rubrique de la base.

    Par contre je ne crois pas pouvoir utiliser cette classe directement pour afficher ma liste de commandes clients, avec une colonne combobox alimentée par la table ETS. Je crois qu'il va falloir que je fasse une autre classe pour ça, mais du coup je me demande l'intérêt d'utiliser Entity Framework dans ce cas.

  10. #10
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    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 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Il vaut mieux pas toucher ce qu'il te génère, après tu peux tenter modifier les noms dans le schema de l'edmx, sinon tu as le solution de code first, tu crée les classes et EF est capable de créer les tables à partir de ca 8t'as une solution pour générer tes classes avec une base existante quand même.

    Apres tu peux exécuter les requêtes que tu veux dessus, je pense pas que t'aura pas de problème pour remplir ton combobox.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2019
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Et si je veux personnaliser les get set pour effectuer un contrôle de la donnée saisie, je suis censé le faire où?

  12. #12
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    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 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Citation Envoyé par Alexandre54690 Voir le message
    Et si je veux personnaliser les get set pour effectuer un contrôle de la donnée saisie, je suis censé le faire où?
    C'est des classes partielles, tu peux crée une autre classe partial avec le même nom et rajouter tes propriétés ici par exemple

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2019
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par youtpout978 Voir le message
    Bonjour,

    en faite le mieux dans ce cas n'est pas de remplir le datagrid met de creer une liste d'objet que vous remplirez avec le résultat de votre requete et ensuite c'est cette liste qui sera la datasource de votre datagridview
    tu as un exemple ici https://www.codeproject.com/Articles...-from-SqlDataR
    ou un autre ici https://www.aspforums.net/Threads/16...g-C-in-ASPNet/
    J'essaie d'utiliser la classe GenericPopulator, mais j'ai une erreur en exécution au niveau d'une ligne de la classe :

    var dbNullExp = Expression.Field(Expression.Parameter(typeof(System.DBNull), "System.DBNull"), dbNullValue);


    System.ArgumentException
    HResult=0x80070057
    Message=Un champ statique requiert une instance null, tandis qu'un champ non statique requiert une instance non null.
    Nom du paramètre*: expression
    Source=System.Core
    Arborescence des appels de procédure*:
    à System.Linq.Expressions.Expression.Field(Expression expression, FieldInfo field)
    à TestAffichageDonneesDivalto.Classes.GenericPopulator`1.GetReader(SqlDataReader reader) dans C:\Users\alexandre54690\source\repos\TestAffichageDonneesDivalto\Classes\GenericListPopulator.cs :ligne 38
    à TestAffichageDonneesDivalto.Classes.GenericPopulator`1.CreateList(SqlDataReader reader) dans C:\Users\alexandre54690\source\repos\TestAffichageDonneesDivalto\Classes\GenericListPopulator.cs :ligne 16
    à TestAffichageDonneesDivalto.COMMANDE_LISTE.COMMANDE_LISTE_Load(Object sender, EventArgs e) dans C:\Users\alexandre54690\source\repos\TestAffichageDonneesDivalto\Form1.cs :ligne 130
    à System.Windows.Forms.Form.OnLoad(EventArgs e)
    à System.Windows.Forms.Form.OnCreateControl()
    à System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
    à System.Windows.Forms.Control.CreateControl()
    à System.Windows.Forms.Control.WmShowWindow(Message& m)
    à System.Windows.Forms.Control.WndProc(Message& m)
    à System.Windows.Forms.ScrollableControl.WndProc(Message& m)
    à System.Windows.Forms.Form.WmShowWindow(Message& m)
    à System.Windows.Forms.Form.WndProc(Message& m)
    à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

    Cette exception a été levée à l'origine dans cette pile des appels*:
    System.Linq.Expressions.Expression.Field(System.Linq.Expressions.Expression, System.Reflection.FieldInfo)
    TestAffichageDonneesDivalto.Classes.GenericPopulator<T>.GetReader(System.Data.SqlClient.SqlDataReader) dans GenericListPopulator.cs
    TestAffichageDonneesDivalto.Classes.GenericPopulator<T>.CreateList(System.Data.SqlClient.SqlDataReader) dans GenericListPopulator.cs
    TestAffichageDonneesDivalto.COMMANDE_LISTE.COMMANDE_LISTE_Load(object, System.EventArgs) dans Form1.cs
    System.Windows.Forms.Form.OnLoad(System.EventArgs)
    System.Windows.Forms.Form.OnCreateControl()
    System.Windows.Forms.Control.CreateControl(bool)
    System.Windows.Forms.Control.CreateControl()
    System.Windows.Forms.Control.WmShowWindow(ref System.Windows.Forms.Message)
    System.Windows.Forms.Control.WndProc(ref System.Windows.Forms.Message)
    ...
    [Pile des appels tronqué]
    Une idée de quoi cela peut venir? As-tu déjà eu cette erreur? ==> Je viens de lire que ça vient de la version du .net framework utilisé et qu'il faut remplacer la ligne par celle-ci, qui fonctionne effectivement :

    var dbNullExp = Expression.Field(expression: null, type: typeof(DBNull), fieldName: "Value");

    Citation Envoyé par youtpout978 Voir le message
    C'est des classes partielles, tu peux crée une autre classe partial avec le même nom et rajouter tes propriétés ici par exemple
    Je ne veux pas ajouter une propriété, mais modifier le comportement d'une propriété, sans toucher à la classe partielle générée. Mais peut-être que ce n'est pas possible, et que ça passe par l'ajout d'une propriété comme tu le conseilles?

  14. #14
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    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 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Generique populator c'est si tu fais de l'ado.net classique, pour entity framework tu n'as pas à faire ca mais directement une requete sur ton contexte, tu ne dois pas mixer les 2.
    https://docs.microsoft.com/en-us/ef/ef6/querying/
    Enity Framework est un ORM, il ajoute une couche d'abstraction à ta base de donnée, il va te générer les classes, les requêtes à ta place tout passera par lui quand tu voudras accéder à ta bdd, au début j'aimais bien maintenant j'évite de l'utiliser.

    Pour les verif sur tes données vaut mieux pas s'amuser a modifier les proprietes de base des objets EF mais plus crée une propriété qui wrap du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      public string NomCheck
            {
                get { return Nom; }
                set
                {
                    if (value!="Admin")
                    {
                        Nom = value;
                    }
                }
            }
    mais tu peux faire le check dans ta business layer ça reste le mieux que de faire ça au niveau des classes.

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2019
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Business layer? Tu veux dire dans le contrôleur?

    Pourquoi n'utilises-tu plus les automatismes de EF6? As-tu eu des problèmes insolubles avec ou c'est juste que tu préfères faire des requêtes SQL que Linq syntaxiquement parlant?

  16. #16
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    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 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Citation Envoyé par Alexandre54690 Voir le message
    Business layer? Tu veux dire dans le contrôleur?

    Pourquoi n'utilises-tu plus les automatismes de EF6? As-tu eu des problèmes insolubles avec ou c'est juste que tu préfères faire des requêtes SQL que Linq syntaxiquement parlant?
    Disons que l'EDMX est plus trop utilisé maintenant c'est surtout le code first qui est utilisé, les principaux problèmes sont je dirais les requêtes générés par EF qui sont pas forcément optimale et qui pause des problèmes de performances, tu as aussi des incompatibilités avec certains type sql ...
    Pour code first si quelqu'un d'autre modifie la base de donnée et n'a pas partager ses modifications EF te génère une erreur t'empechant d'utiliser la base de données, à 3 ou 4 sur un même projet ca devient vite le bordel.
    Après le plus, c'est une rapidité de développement accru, si t'es tout seul sur ton appli et que tu ne vise pas de grosse performance tu peux l'exploiter.

    https://www.c-sharpcorner.com/articl...-is-different/

    Pour le business layer je parle d'architecture multicouche
    https://immobilis.developpez.com/art...ouche-asp-net/
    Tu peux l'appliquer à windowsforms, en général t'évite de faire les requêtes directement dans la vue.

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2019
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Donc si je comprends bien, il vaut mieux que je procède ainsi ?

    https://docs.microsoft.com/fr-fr/asp...a-access-layer

  18. #18
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    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 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Citation Envoyé par Alexandre54690 Voir le message
    Donc si je comprends bien, il vaut mieux que je procède ainsi ?

    https://docs.microsoft.com/fr-fr/asp...a-access-layer
    Tu peux utiliser linq, les problèmes de perfs tu les as si tu as beaucoup d'utilisateur et beaucoup de données.

  19. #19
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2019
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    A vrai dire je n'ai pas compris comment peupler la list sur laquelle s'exécute la requête linq à partir de la base de données car les exemples (comme celui ci-dessous) que j'ai vu montrent des ajouts manuels dans cette list :

    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
    // Create a data source by using a collection initializer.
    static List<Student> students = new List<Student>
    {
        new Student {First="Svetlana", Last="Omelchenko", ID=111, Scores= new List<int> {97, 92, 81, 60}},
        new Student {First="Claire", Last="O'Donnell", ID=112, Scores= new List<int> {75, 84, 91, 39}},
        new Student {First="Sven", Last="Mortensen", ID=113, Scores= new List<int> {88, 94, 65, 91}},
        new Student {First="Cesar", Last="Garcia", ID=114, Scores= new List<int> {97, 89, 85, 82}},
        new Student {First="Debra", Last="Garcia", ID=115, Scores= new List<int> {35, 72, 91, 70}},
        new Student {First="Fadi", Last="Fakhouri", ID=116, Scores= new List<int> {99, 86, 90, 94}},
        new Student {First="Hanying", Last="Feng", ID=117, Scores= new List<int> {93, 92, 80, 87}},
        new Student {First="Hugo", Last="Garcia", ID=118, Scores= new List<int> {92, 90, 83, 78}},
        new Student {First="Lance", Last="Tucker", ID=119, Scores= new List<int> {68, 79, 88, 92}},
        new Student {First="Terry", Last="Adams", ID=120, Scores= new List<int> {99, 82, 81, 79}},
        new Student {First="Eugene", Last="Zabokritski", ID=121, Scores= new List<int> {96, 85, 91, 60}},
        new Student {First="Michael", Last="Tucker", ID=122, Scores= new List<int> {94, 92, 91, 91}}
    };
    Ce n'est peut-être pas utile que je m'y attarde s'il y a des problèmes de performances...

    Aussi je pense procéder ainsi, à moins que tu suggères une meilleure solution : https://docs.microsoft.com/fr-fr/asp...a-access-layer

  20. #20
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    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 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Le TableAdapter c'est limite l’ancêtre d'EntityFramework, si tu veux te passer d'EF garde le fonctionnement originale et crée juste ta liste manuellement, après je ne sais pas ce qui te fais penser que tu aura des problèmes de perf avec EF
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    List<Piece> pieces=new List<Piece>();
    while (oReader.Read())
                        {
                            // ajout de la commande client dans la table
                            Piece pi= Piece();
                            pi.Toto = oReader[1];
                            pi.Alfred= oReader[2];
                            pi.Marie= oReader[3];
                            pieces.Rows.Add(pi);
                        }

Discussions similaires

  1. Réponses: 4
    Dernier message: 20/08/2019, 10h23
  2. Remplir un datagridview a partir d'un formulaire enfant
    Par siro1 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 10/03/2015, 08h23
  3. Réponses: 4
    Dernier message: 06/09/2010, 20h08
  4. Réponses: 3
    Dernier message: 12/06/2009, 12h49
  5. remplir dataGridView à partir de mon dataset
    Par toutou2000 dans le forum C#
    Réponses: 5
    Dernier message: 27/11/2008, 15h04

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