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

Accès aux données Discussion :

[C#2.0] Mettre à jour la base de données à partir d'une DataTable


Sujet :

Accès aux données

  1. #1
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 171
    Points : 122
    Points
    122
    Par défaut [C#2.0] Mettre à jour la base de données à partir d'une DataTable
    Bonjour

    Je m'arrache les cheveux en essayant de mettre à jour ma BdD SQL à partir d'une DataTable. J'ai essayé tt ce que j'ai trouvé sur Internet :'(
    Voici mon code simplifié :
    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
    using (SqlConnection connection = new SqlConnection("..."))
    {
      DataTable dataTable = new DataTable();
      string command = "select id_planning, member from planning";
     
      connection.Open();
      SqlDataAdapter dataAdapter = new SqlDataAdapter();
      SqlCommand cmd = new SqlCommand(command, connection);
      dataAdapter.SelectCommand = cmd;
     
      // ça, je ne le réutilise pas donc je sais pas à quoi ça sert :'(
      SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);
      commandBuilder.GetDeleteCommand();
      commandBuilder.GetInsertCommand();
      commandBuilder.GetUpdateCommand();
     
      dataAdapter.Fill(dataTable);
     
      // update database
      DataRow newRow = dataTable.NewRow();
      newRow["member"] = "robert";
      dataTable.Rows.Add(newRow);
      dataTable.AcceptChanges();
      dataAdapter.Update(dataTable);
    }
    Et bien il se trouve que ma base de données n'est jamais updatée. J'ai essayé avec LoadDataRow() et ça marche pas mieux.
    Si qqn a une ptite idée, ça serait gentil
    Merci bien.

  2. #2
    Membre actif Avatar de DarkMolo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    207
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Maroc

    Informations forums :
    Inscription : Juillet 2006
    Messages : 207
    Points : 277
    Points
    277
    Par défaut
    Salut,
    Je te recommande de revoir plus en détails un cours ADO.Net(y'en a sur developpez), et plus précisement le fonctionnement d'un DataAdapter, en fait ce dernier comporte quatre object(référence) commande:
    SelectCommand - InsertCommand - UpdateCommand - DeleteCommand.

    Et quand t'appelles la méthode Update du DataAdapter, si tu pouvais voir l'implémentation de cette méthode tu y verras des appels aux trois derniers commandes selon l'état du DataRow, ça ressemblerai à ça:
    Code C# : 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
    class DataAdapter
    {
          public Update(DataTable dt)
          {
            for each (DataRow dr in dt.Rows)
                        switch (dr.RowState)
                        {
                            case DataRowState.Added:
                                //Remplir les paramètres de la collection oda.InsertCommand.Parameters avec les données de la ligne dr
                                oda.InsertCommand.ExecuteNonQuery()
                                break;
                            case DataRowState.Modified:
                                //Remplir les paramètres de la collection oda.UpdateCommand.Parameters avec les données de la ligne dr
                                oda.UpdateCommand.ExecuteNonQuery()
                                break;
                            case DataRowState.Deleted:
                                //Remplir les paramètres de la collection oda.DeleteCommand.Parameters avec les données de la ligne dr
                                oda.DeleteCommand.ExecuteNonQuery()
                                break;
                        }
          }
    }
    Pas exactement pareil, mais tout de même près.

    Donc certainement ton code serait plutôt:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // ça, je ne le réutilise pas donc je sais pas à quoi ça sert :
      SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);
      dataAdapter.DeleteCommand=commandBuilder.GetDeleteCommand();
      dataAdapter.InsertCommand=commandBuilder.GetInsertCommand();
      dataAdapter.UpdateCommand=commandBuilder.GetUpdateCommand();

    Et puis enfin, le plus grave:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dataTable.AcceptChanges();
    dataAdapter.Update(dataTable);

    Appeler AcceptChanges va remettre valider toutes les lignes du DataTables, cad que leurs RowState sera égale à DataRowState.Unchanged et que par conséquent la méthode Update du DataAdapter ne fera rien, suffit de les inverser:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dataAdapter.Update(dataTable);
    dataTable.AcceptChanges();

    Je te le répète, vaudrait mieux que tu revoie un vrai bon cours visant l'ADO.Net.

  3. #3
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 171
    Points : 122
    Points
    122
    Par défaut
    Coucou

    Ah bin en qq lignes de tes explications, j'en ai compris 10 fois plus qu'en 10 articles sur le Web
    Mici bien

    Bin sur Internet, quand je tape "Dataset" ou "Datatable" dans Google, franchement c'est mal documenté. J'ai pas de bon tutoriels :'(
    En fait, faut taper "ADO.net"

  4. #4
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 171
    Points : 122
    Points
    122
    Par défaut
    Euh un ptit problème... j'ai trouvé qq trucs sur Internet mais ça ne veut pas marcher sur mon ordi :'(
    En fait, je modifie ma DataTable et utilisant LoadDataRow(). Ensuite, j'update ma base de donnée avec mon SqlDataAdapter. Et je m'attends à avoir une ligne updatée. Seulement, à chaque fois, il ajoute une ligne :'(

    Voici mon code simplifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // il s'agit d'une table avec 2 champs dont le premier est Primary Key + auto-incrementable
    // il existe déjà en base une ligne avec la même PK = 1, mais "julien" au lieu de "robert"
    object[] row = new object[2];
    row[0] = "1";
    row[1] = "robert";
     
    dataTable.BeginLoadData();
    dataTable.LoadDataRow(row, false);
    dataTable.EndLoadData();
     
    dataAdapter.Update(dataTable);
    dataTable.AcceptChanges();
    Pourquoi ce code insert une ligne en base au lieu d'updater celle où la primary key = 1 ?
    Merci bien

  5. #5
    Membre actif Avatar de DarkMolo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    207
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Maroc

    Informations forums :
    Inscription : Juillet 2006
    Messages : 207
    Points : 277
    Points
    277
    Par défaut
    Lol, vraiement content que ça t'a aidé, comme je te l'ai dit, l'ajout, la modification ou la suppression d'un DataRow dépend de sa proprièté RowState, vérifes cette valeur dans ton code avec un simple MessageBox:

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dataTable.BeginLoadData();
    MessageBox.Show(dataTable.LoadDataRow(row, false)RowState.ToString());
    dataTable.EndLoadData();

    Si t'as le MSDN, F1 sur LoadDataRow, y'a mieux comme explications mais ça peut t'aider.

    Bonne chance.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bonjour à tous,

    J'avais le même problème que toi, y a encore 5 min.
    J'ai cherché sur le net mais toutes les solutions trouvées ne resolvaient pas mon problème.
    Juste pour préciser, j'utilise un base mysql et je créé des connexions avec le connecteur .net de mysql.

    J'ai réussi à résoudre mon problème en définissant une clé primaire pour mon datatable (la clé primaire est bien définie dans la table mysql mais ne se retrouve pas dans mon datable )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim DT_col(1) As DataColumn
    DT_col(0) = Planning.Columns(Planning.Columns.IndexOf("order_id"))
    Planning.PrimaryKey = DT_col
    Bonne journée à tous.
    GaD

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 20
    Points : 19
    Points
    19
    Par défaut
    Salut à tous,

    je me suis confronté au même soucis que Rodie, et en cherchant sur la toile je suis tombé sur cet article.
    En bref, pour que LoadDataRow update bien la ligne au lieu de l'ajouter à la DataTable, est d'effectuer un AcceptChanges() avant d'appeler LoadDataRow.

    Je l'ai testé pour moi et ça fonctionne

    Fred

Discussions similaires

  1. [MySQL] Travailler en local et mettre à jours la base de données distante
    Par mouchkar dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/09/2009, 14h49
  2. Mettre à jour ma base de données depuis un DataGridview
    Par The-msx dans le forum Windows Forms
    Réponses: 3
    Dernier message: 13/07/2009, 10h52
  3. Réponses: 5
    Dernier message: 13/11/2008, 13h57
  4. Je ne parviens pas à mettre à jour la base de données
    Par pablito222 dans le forum VB.NET
    Réponses: 4
    Dernier message: 02/11/2008, 12h11
  5. Réponses: 1
    Dernier message: 26/08/2008, 23h55

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