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

Mettre à jour la base de données à partir d'une DataTable [.NET 2.0] - C#/.NET managed - Programmation

Marsh Posté le 10-02-2007 à 14:24:38    

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 :
  1. using (SqlConnection connection = new SqlConnection("..." ))
  2. {
  3.   DataTable dataTable = new DataTable();
  4.   string command = "select id_planning, member from planning";
  5.   connection.Open();
  6.   SqlDataAdapter dataAdapter = new SqlDataAdapter();
  7.   SqlCommand cmd = new SqlCommand(command, connection);
  8.   dataAdapter.SelectCommand = cmd;
  9.   // ça, je ne le réutilise pas donc je sais pas à quoi ça sert :'(
  10.   SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);
  11.   commandBuilder.GetDeleteCommand();
  12.   commandBuilder.GetInsertCommand();
  13.   commandBuilder.GetUpdateCommand();
  14.   dataAdapter.Fill(dataTable);
  15.   // update database
  16.   DataRow newRow = dataTable.NewRow();
  17.   newRow["member"] = "robert";
  18.   dataTable.Rows.Add(newRow);
  19.   dataTable.AcceptChanges();
  20.   dataAdapter.Update(dataTable);
  21. }


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.


Message édité par Roodie le 10-02-2007 à 14:26:45
Reply

Marsh Posté le 10-02-2007 à 14:24:38   

Reply

Marsh Posté le 10-02-2007 à 17:30:59    

Je crois que tu ne dois pas utiliser la méthode AcceptChanges si tu veux utiliser la méthode Update, car elle réinitialise à UnChanged la propriété DataRowState. Or Update utilise cette propriété pour savoir quelles lignes doivent être modifiées !
 
AcceptChanges n'est utile que si tu n'as pas l'intention de mettre à jour la base à partir du groupe de données, ce que tu sembles pourtant vouloir faire ;)
 
A vérifier dans la MSDN ;)
 
edit: ça fonctionne comme ça en 1.1, il n'y a pas de raison que cela soit différent en 2.0


Message édité par pikti le 10-02-2007 à 17:34:00
Reply

Marsh Posté le 10-02-2007 à 17:54:36    

Oui effectivement, AcceptChanges () doit être placé après avoir fait l'update en base, sinon ça sert à rien :)
Merci bien à toi :)

Reply

Marsh Posté le 10-02-2007 à 19:54:30    

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 :
  1. // il s'agit d'une table avec 2 champs dont le premier est Primary Key + auto-incrementable
  2. // il existe déjà en base une ligne avec la même PK = 1, mais "julien" au lieu de "robert"
  3. object[] row = new object[2];
  4. row[0] = "1";
  5. row[1] = "robert";
  6. dataTable.BeginLoadData();
  7. dataTable.LoadDataRow(row, false);
  8. dataTable.EndLoadData();
  9. dataAdapter.Update(dataTable);
  10. dataTable.AcceptChanges();


Pourquoi ce code insert une ligne en base au lieu d'updater celle où la primary key = 1 ?
Merci bien :)

Reply

Marsh Posté le 10-02-2007 à 20:52:59    

Si le LoadDataRow ne trouve pas la ligne il en créé une.
 
Il faut sans doute que tu commences par charger la ligne "1" "julien" puis modifier "julien" en "robert" et updater, non ?
 
edit : et il faut peut-être faire le load à true si tu veux effectuer des modifs.
 
Enfin c'est ce que je comprends en lisant la MSDN, je n'ai jamais utilisé ces méthodes :)


Message édité par pikti le 10-02-2007 à 20:54:37
Reply

Marsh Posté le 10-02-2007 à 21:44:04    

Bin ma ligne "1" "julien" se trouve bien dans mon dataset pourtant...
Et puis j'ai aussi essayé de changer le 2ème argument de LoadDataRow(), mais quand il vaut "True", ça ne fait aucun changement en base :'(
En tout cas, merci bcp pour ton aide :)
Et si qqn a une idée :)

Reply

Marsh Posté le 11-02-2007 à 08:10:12    

je répète : si le LoadDataRow ne trouve pas la ligne il en créé une.
 
Ton problème vient donc de là. Dans ton exemple tu recherches "robert" alors que tu veux modifier "julien" en "robert" si j'ai bien compris.  
 
Cherche donc julien, robert n'existant pas

Reply

Marsh Posté le 11-02-2007 à 16:20:49    

Bin je comprends pas bien  :cry:  
 
Ma DataTable contient au début une ligne :  
id = "1" (primary key)
membre = "julien"
 
Quand je fais un LoadDataRow(row), avec row = ("1", "robert" ), bin d'après MSDN, ça devrait rechercher une ligne contenant avec id="1" dans ma DataTable (indépendamment du membre comme tu le dis).  
 
Et comme j'ai bien une ligne avec id="1", bin ça devrait updater la ligne ("1", "julien" ) et ("1", "robert" ).  
 
Or dans mon cas, ça insert une nouvelle ligne  :cry:  
Pourtant, j'ai bien défini la première column de ma DataTable comme Primary Key... bizarre.  
Merci bien en tout cas :)

Reply

Marsh Posté le 11-02-2007 à 20:31:58    

sinon suffit de traiter l'event RowUpdating de ta datatable ou dataset (je ne sais plus). Ce qui déclenchera à chaque change l'event et la tu construit via les paramètres qui te sont passé une requête CUSTOM.  
 
Et lorsque tu feras UPDATE, il prendra tout les requêtes CUSTOM qui auront été chargée dans les Events déclenché (RowUpdating) et updatera ta DB à ta guise. C'est de loin la meilleur solution étant donné que tu le fais comme toi tu le veux.

Reply

Marsh Posté le 12-02-2007 à 09:11:11    

Roodie a écrit :

Bin je comprends pas bien  :cry:  
 
Ma DataTable contient au début une ligne :  
id = "1" (primary key)
membre = "julien"
 
Quand je fais un LoadDataRow(row), avec row = ("1", "robert" ), bin d'après MSDN, ça devrait rechercher une ligne contenant avec id="1" dans ma DataTable (indépendamment du membre comme tu le dis).  
 
Et comme j'ai bien une ligne avec id="1", bin ça devrait updater la ligne ("1", "julien" ) et ("1", "robert" ).  
 
Or dans mon cas, ça insert une nouvelle ligne  :cry:  
Pourtant, j'ai bien défini la première column de ma DataTable comme Primary Key... bizarre.  
Merci bien en tout cas :)


 
LoadDataRow te load une ligne existante, tu dois donc chercher "1", "julien" si c'est ce que tu as dans ta DataTable. Ensuite tu modifes "julien" en "robert" puis tu update.

Reply

Marsh Posté le 12-02-2007 à 09:11:11   

Reply

Marsh Posté le 12-02-2007 à 17:36:55    

Mais nan pikti :)  
T'as pas compris ce que fait (ou est censé faire) le LoadDataRow()
MSDN dit :

Citation :

Recherche et met à jour une ligne spécifique. Si aucune ligne correspondante n'est détectée, une nouvelle ligne est créée à l'aide des valeurs données.  
La méthode LoadDataRow prend un tableau de valeurs et recherche les valeurs correspondantes dans les colonnes de clés primaires


Donc si ma DataTable contient ("1", "julien" ) et que je fais LoadDataRow de ("1", "robert" ), et bien la méthode devrait voir que l'ID clé primaire "1" existe et donc update "julien" en "robert" (et non rajouté une ligne).  
T'es d'accord avec ça ?
 
En tout cas sur Internet, ya pas mal de gens qui ont eu mon problème, et les solutions proposées ne marchent pas chez moi :(
Et si vraiment ça ne marche pas, je ferai tout à la main comme tu le proposes moi23372 :)
Donc si qqn a une idée :)
Mici bien en tout cas.


Message édité par Roodie le 12-02-2007 à 17:37:58
Reply

Marsh Posté le 12-02-2007 à 20:42:52    

ok, j'ai donc mal compris :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed