Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
713 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1512988
Roodie
Posté le 10-02-2007 à 14:24:38  profilanswer
 

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
mood
Publicité
Posté le 10-02-2007 à 14:24:38  profilanswer
 

n°1513032
pikti
I’ve done worse
Posté le 10-02-2007 à 17:30:59  profilanswer
 

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
n°1513036
Roodie
Posté le 10-02-2007 à 17:54:36  profilanswer
 

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

n°1513060
Roodie
Posté le 10-02-2007 à 19:54:30  profilanswer
 

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 :)

n°1513070
pikti
I’ve done worse
Posté le 10-02-2007 à 20:52:59  profilanswer
 

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
n°1513090
Roodie
Posté le 10-02-2007 à 21:44:04  profilanswer
 

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 :)

n°1513137
pikti
I’ve done worse
Posté le 11-02-2007 à 08:10:12  profilanswer
 

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

n°1513281
Roodie
Posté le 11-02-2007 à 16:20:49  profilanswer
 

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 :)

n°1513360
moi23372
Posté le 11-02-2007 à 20:31:58  profilanswer
 

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.

n°1513458
pikti
I’ve done worse
Posté le 12-02-2007 à 09:11:11  profilanswer
 

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.

mood
Publicité
Posté le 12-02-2007 à 09:11:11  profilanswer
 

n°1513755
Roodie
Posté le 12-02-2007 à 17:36:55  profilanswer
 

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
n°1513847
pikti
I’ve done worse
Posté le 12-02-2007 à 20:42:52  profilanswer
 

ok, j'ai donc mal compris :)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

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

 

Sujets relatifs
[VB.Net] Mis à Jour d'une base de données commune à 2 formulaires...[VB.NET] Windows Media Player sur PDA [RESOLU]
Connections à la base de donnéesPas tapé ... Newbie : Tableur ou Base de données
Une Form base authentification en utilisant les LoginModules de Jboss 
Plus de sujets relatifs à : [.NET 2.0] Mettre à jour la base de données à partir d'une DataTable


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR