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

Entity Framework Discussion :

Mise à jour d'une base SQlite à partir d'un DGV


Sujet :

Entity Framework

  1. #1
    Membre actif
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Points : 207
    Points
    207
    Par défaut Mise à jour d'une base SQlite à partir d'un DGV
    Bonjour,

    Je suis en pleine découverte de Entity Framework et je patauge lamentablement depuis un bon moment pour charger "proprement" un DGV à partir du contexte et renvoyer les modifications vers la base SQlite sous-jacente.
    Je manipule la base exemple "Chinook".
    J'utilise C# avec VS2012 , Framework 4.5 et EF 5.0.0.

    J'initialise le DGV avec :
    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
     
            public Form1()
            {
                InitializeComponent();
                context = new Chinook_SqliteEntities();
            }
     
            private class DataBindingProjection
            {
                public long ArtistId { get; set; }
                public string Name { get; set; }
            }
     
            private void LoadGrid()
            {
                    var artists = from a in context.Artist
                                  where a.Name.StartsWith("A")
                                  orderby a.Name
                                  select new DataBindingProjection
                                  {
                                      ArtistId = a.ArtistId,
                                      Name = a.Name
                                  };
     
                    try
                    {
                        bindingSource1.DataSource = artists.ToList();
                        dataGridView2.DataSource = bindingSource1;
                     }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Erreur" + ex.Message, "Ouverture base", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    finally
                    {
                    }
     
            }
    J'ai défini un bouton pour effectuer la mise à jour de la base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            private void button3_Click(object sender, EventArgs e)
            {
                using (var context = new Chinook_SqliteEntities())
                {
                    context.SaveChanges();
                }
            }
    Je modifie les valeurs dans le DGV mais les mises à jour de la base ne se font pas : ni en création, ni en modification ni en suppression.

    J'ai réussi néanmoins à ajouter par code un nouvelle entité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            private void button2_Click(object sender, EventArgs e)
            {
               using (var context = new Chinook_SqliteEntities())
                {
                    context.Artist.Add(
                    new Artist
                    {
                        Name = "Aaaa6"
                    });
                    context.SaveChanges();
                }
            }
    Je cherche et re...cherche sur les forums mais je n'ai encore rien trouvé de vraiment convaincant
    Je vous remercie d'avance pour vos "coups de pouce" d'experts à un débutant qui voudrait bien comprendre et avancer, un peu, vers la connaissance !

  2. #2
    Membre actif
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Points : 207
    Points
    207
    Par défaut
    Bon, je continue de chercher ...
    En parcourant les forums, j'ai cru comprendre que la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bindingSource1.DataSource = artists.ToList();
    pourrait être la cause de mes difficultés.
    Est-ce dans cette direction que je dois chercher ?

    Merci d'avance pour vos réponses.
    Cordialement,

  3. #3
    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
    En faite il faut que le context utilisé pour la récupération des données et la sauvegarde soit le même, sinon il n'as pas connaissance des données modifier.
    Ou il faut faire une méthode de maj plus complète.

  4. #4
    Membre actif
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Points : 207
    Points
    207
    Par défaut
    Bonsoir Youtpout,

    Merci de t'intéresser à mes soucis de débutant ...
    En faite il faut que le context utilisé pour la récupération des données et la sauvegarde soit le même, sinon il n'as pas connaissance des données modifier.
    Je n'ai déclaré qu'une fois le context :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            public Form1()
            {
                InitializeComponent();
                context = new Chinook_SqliteEntities();
            }
    Mais le problème reste identique.
    J'ai essayé de remplir une Datatable à partir de la requête puis de la déclarer comme datasource du DataGridView :
    J'ai fais cà à la "brutale" mais bon ...
    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
     
            private void LoadGrid()
            {
                var query = from a in context.Artist
                            where a.Name.StartsWith("A")
                            orderby a.Name
                            select new
                            {
                                ArtistId = a.ArtistId,
                                Name=a.Name
                             };
                SQLdt = new DataTable();
                SQLdt.Columns.Add("ArtistId", typeof(Int64));
                SQLdt.Columns.Add("Name", typeof(string));
     
                foreach (var x in query)
                {
                    DataRow row=SQLdt.NewRow();
                    row["ArtistId"]= x.ArtistId;
                    row["Name"]=x.Name;
                    SQLdt.Rows.Add(row);
                }
                        bindingSource1.DataSource = SQLdt;
                        dataGridView2.DataSource = bindingSource1;
             }
    le code pour la sauvegarde :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            private void button3_Click(object sender, EventArgs e)
            {
               // using (var context = new Chinook_SqliteEntities())
                {
                    context.SaveChanges();
                }
            }
    La mise à jour ne se fait pas. Mais en fait je ne comprends pas bien le lien entre la Datasource de mon DataGrid (SQLdt) et le context.
    Je comprends bien le chargement de la table avec la requete à partir du context mais je comprends pas le mécanisme de mise à jour de la table vers le context ...
    Donc pas étonnant que je ne trouve pas !

    Une petite lumière serait bien venue ...

    Merci d'avance.

  5. #5
    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
    Voilà un code tout simple qui marche chez moi, peut être le faite de travailler avec tes propres objets ne permet pas de connaitre les modifications.
    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
     public partial class Form1 : Form
        { 
            TestEntities context;
            public Form1()
            {
                InitializeComponent();
                context = new TestEntities();
                ChargerGridView();
            }
     
            private void ChargerGridView()
            {
                dataGridView1.DataSource = context.Artists;
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                context.SaveChanges();
            }
        }
    PS: avec ce bout de code la modif, l'ajout et la suppression marche.

  6. #6
    Membre actif
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Points : 207
    Points
    207
    Par défaut
    Bonjour YoutPout,

    J'ai transposé ton bout de code dans mon projet :
    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
     
        public partial class Form1 : Form
        {
            Chinook_SqliteEntities context;
     
            public Form1()
            {
                InitializeComponent();
                context = new Chinook_SqliteEntities();
                ChargerGrid();
            }
     
            private void ChargerGrid()
            {
                dataGridView2.DataSource = context.Artist;
            }
     
            private void button3_Click(object sender, EventArgs e)
            {
                context.SaveChanges();
            }
        }
    Mais une exception est levée lors de la compilation de ChargerGrid :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    La liaison de données directement à une requête de stockage (DbSet, DbQuery, DbSqlQuery) 
    n'est pas prise en charge. Remplissez plutôt un DbSet avec des données, par exemple,
     en appelant la méthode Load sur le DbSet, puis liez aux données locales.
    Pour WPF liez à DbSet.Local. Pour WinForms liez à DbSet.Local.ToBindingList().
    Est-ce que j'ai loupé quelque chose en "amont" avec la base SQLite, ou ... ?

    Je te remercie d'avance pour tes idées.

  7. #7
    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
    essaye de mettre un toList() après ton context.Artist

  8. #8
    Membre actif
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Points : 207
    Points
    207
    Par défaut
    Merci Youtpout pour ton aide.
    En googlisant j'ai fini par trouvé comment mettre en œuvre la solution décrite dans l'exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                context.Artist.OrderBy(a => a.Name).Where(a => a.Name.StartsWith("A")).Load();
                dataGridView2.DataSource = context.Artist.Local.ToBindingList();
    Cà a l'air de fonctionner

    Il me reste 2 questions à élucider :

    • Peut-on généraliser ce formalisme avec des requêtes plus complexes avec des jointures par exemple ?
    • Je n'arrive pas à rafraîchir le DataGridView après une insertion. Je dois sortir de l'application et re-entrer pour afficher la nouvelle donnée à sa bonne place et avec le bon Identifiant. Comment faire mieux ?

  9. #9
    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
    tu travail bien en windows form ?
    il faudrait que je test avec le provider SQLlite , mon test était avec une base de donnée sqlserver.

    Et je pense que ça s'applique avec tout type de requête.

  10. #10
    Membre actif
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Points : 207
    Points
    207
    Par défaut
    Oui, je suis bien en Windows Forms.
    Je continue à chercher sans trop de résultat pour l'instant.
    Le dernier code testé est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private void ChargerGrid()
            {
                context.Artist.OrderBy(a => a.Name).Where(a => a.Name.StartsWith("A")).Load();
                dataGridView2.DataSource = context.Artist.Local.ToBindingList();
            }
     
    private void dataGridView2_CellValueChanged(object sender, DataGridViewCellEventArgs e)
            {
                    context.SaveChanges();
                    dataGridView2.DataSource = null;
                    dataGridView2.Refresh();
                    ChargerGrid();
            }
    Mais cà ne provoque aucun rafraichissement du DGV après un insert ...

  11. #11
    Membre actif
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Points : 207
    Points
    207
    Par défaut
    Bonsoir,

    Je reviens sur le 1° point qu'il me reste à trouver :

    Peut-on généraliser ce formalisme avec des requêtes plus complexes avec des jointures par exemple ?
    Mes recherches ne m'ont pas permis, pour l'instant, d'avoir de piste satisfaisante.

    Ma question : Est-ce que EF permet la mise à jour de plusieurs tables d'une BD après la mise à jour d'un DataGridView basée sur une requête Linq (avec jointure) ? ou faut-il que je cherche dans une autre direction ?

    Je vous remercie pour vos avis.

Discussions similaires

  1. Mise à jour d'une base sqlite via php
    Par joreveur dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 09/06/2015, 11h20
  2. Mise à jour d'une base a partir d'upload de fichiers
    Par soussou1010 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 12/08/2014, 10h47
  3. Réponses: 4
    Dernier message: 25/05/2011, 18h08
  4. Réponses: 4
    Dernier message: 05/08/2009, 14h00
  5. mise a jour d'une base a partir d'une autre base
    Par seb3099 dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 18/06/2004, 08h20

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