Précédent   Forum du club des développeurs et IT Pro > Dotnet > Langages > C#
C# Forum d'entraide sur la programmation C#. Avant de poster -> FAQ C#, Articles C#, Sources C#
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 18/01/2013, 00h29   #1
Synoyx
Invité de passage
 
Homme Julien
Développeur informatique
Inscription : septembre 2011
Messages : 16
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Bâtiment

Informations forums :
Inscription : septembre 2011
Messages : 16
Points : 4
Points : 4
Par défaut Update d'un DataAdapter avec un dataset de 3 datables

Bonjour,

Je viens ici pour demander un coup de main sur un problème qui me turlupine depuis bientôt 2 semaines ... Êtant plutôt spécialisé au développement web, je n'ai pas l'habitude d'utiliser le C#, mais je pense que ce problème reste assez complexe et est au dessus d'un problème de débutant.

Pour faire simple, je développe une application dont un des écrans contient 3 DGV. Ces DGV sont là pour afficher et permettre une modification / suppression d'informations. Pour faire simple, le 1er DGV présente les éléments "Père", et lorsqu'on en sélectionne un les deux autres DGV sont ré-actualisés pour afficher les deux enfants du père concerné.
Je n'ai aucun problème dans cette gestion des 3 DGVs, j'ai d'abord voulu gérer ça grâce à un databinding, mais étant en manque de temps j'ai finalement tout fait moi même
Mon problème est dans l'enregistrement des modifications effectuées dans un ou plusieurs des DGV. Pour expliquer un peut tout ça, j'avais rédigé un pdf pour l'envoyer à mon prof qui ne m'a pas répondu, et le temps passe, mais je pense que je peux vous mettre globalement la même explication, qui est claire je trouve. N'hésitez pas à demander des précisions si besoin !

Citation:
Problème :
Comment faire un update d'un dataAdapter avec un dataSet contenant 3 tables ( ou faire 3 updates avec 3 DataTables ).

Dans mon code, j'ai créé une petite fonction à laquelle je passe en paramètre des requêtes, et celle-ci va actualiser chacun des DGVs avec la requête fournie.
Pour se faire, la fonction procède en 3 étapes : elle déclare un DataSet, dans lequel seront stockés les 3 data tables. Elle déclare également le DataAdapter dans lequel seront stockées les données :


La fonction ajoute ensuite la data table au data adapter et au data set :


Et enfin, on rempli le DGV :


Le problème réside dans l'enregistrement de modifications. Celle-ci intervient lorsqu'on veut quitter la fenêtre, et utilise DataS.HasChanges() pour détecter s'il y a eu ou non des modifications. Si c'est le cas, il faut enregistrer ces modifications dans la BDD.
Le problème, c'est que cela fonctionne pour un seul des trois DGV, celui en bas à gauche traitant des frais forfaitaires, soit la dernière data table crée dans le code ( peut être le problème ? )
Pour mettre à jour, j'utilise ce code :


Plusieurs choses, en essayant un update sur la data table 3, tout va bien. En essayant un update sur la datable, pas de message d'erreur mais pas d'enregistrement de modif, et enfin en essayant sur la table2, j'ai un message d'erreur me parlant d'une colonne qui n'est même pas sensée concerner la table.
Comment puis-je palier à ce problème ?
Synoyx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2013, 01h05   #2
Rainui
Membre expérimenté
 
Homme Yves TRICHAUD
Technicien bio médical
Inscription : décembre 2012
Messages : 222
Détails du profil
Informations personnelles :
Nom : Homme Yves TRICHAUD
Âge : 29
Localisation : France, Gard (Languedoc Roussillon)

Informations professionnelles :
Activité : Technicien bio médical
Secteur : Santé

Informations forums :
Inscription : décembre 2012
Messages : 222
Points : 543
Points : 543
Bonsoir,

vous devriez vérifier les valeurs des propriétés de l'objet DataAdapter que vous utilisez pour mettre à jour vos données en mode pas à pas.

En vb.net, il existe la propriété TableMappings qui contient les tables mappées du DataAdapter, je présume qu'il doit exister la même en C#.

D'après l'erreur que vous annoncez, on dirait qu'il vise une table différente que celle escomptée.

EDIT: Vous pouvez aussi faire un update de tout le dataset, ça vous évite de passer en revue vos 3 DataTables
__________________
est ton amis, MSDN est ton maître, pour le reste il y a Developpez.net. Pensez au au et
Rainui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2013, 10h24   #3
Synoyx
Invité de passage
 
Homme Julien
Développeur informatique
Inscription : septembre 2011
Messages : 16
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Bâtiment

Informations forums :
Inscription : septembre 2011
Messages : 16
Points : 4
Points : 4
Merci pour votre réponse, je ne connaissais pas TableMapping et je vais l'essayer ce soir pour voir ce qu'il en est

Par contre pour l'update avec le dataset, c'est la première chose que j'ai fait mais ça buguait tout autant. Si je montre l'exemple en prenant datatable par datatable, c'est pour montrer l’étrangeté du problème : l'update fonctionne avec une mais pas avec les autres
Synoyx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2013, 13h30   #4
Graffito
Expert Confirmé Sénior
 
Avatar de Graffito
 
Inscription : janvier 2006
Messages : 5 390
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 5 390
Points : 6 036
Points : 6 036
Il me semble qu'un DataAdapter n'a qu'un seul jeu de Select/Insert/Update/DeleteCommand. Le CommandBuilder se base donc sur la SelectCommand courante (celle de la table3) pour définir les mises à jour à effectuer. Ainsi le 2ème Update opérera avec la même commande que le premier et il ne se passerra rien.

On devrait éviter ce problème en créant un DataAdapter par table.
__________________
" Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson
Graffito est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 18/01/2013, 14h20   #5
Rainui
Membre expérimenté
 
Homme Yves TRICHAUD
Technicien bio médical
Inscription : décembre 2012
Messages : 222
Détails du profil
Informations personnelles :
Nom : Homme Yves TRICHAUD
Âge : 29
Localisation : France, Gard (Languedoc Roussillon)

Informations professionnelles :
Activité : Technicien bio médical
Secteur : Santé

Informations forums :
Inscription : décembre 2012
Messages : 222
Points : 543
Points : 543
Graffito >> Vilain, tu lui as donné la réponse

Citation:
On devrait éviter ce problème en créant un DataAdapter par table.
C'est une solution.

Une autre solution est d'utiliser un DataSet fortement typé. Personnellement, j'en abuse, c'est tellement plus simple de retrouver ses objets et méthodes
__________________
est ton amis, MSDN est ton maître, pour le reste il y a Developpez.net. Pensez au au et
Rainui est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/01/2013, 22h52   #6
Synoyx
Invité de passage
 
Homme Julien
Développeur informatique
Inscription : septembre 2011
Messages : 16
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Bâtiment

Informations forums :
Inscription : septembre 2011
Messages : 16
Points : 4
Points : 4
Merci pour vos réponses ! Je ne savais pas pour les dataadapters mais je retiens l'info
J'ai presque réparé mon bug mais je pense gérer le reste.


Par contre pour le dataset typé je n'ai pas trop compris : en gros je peux dans l'outil créer l'objet en insérant X tables dans celui-ci ? mais comment je peux ensuite utiliser ça ? Pour passer mes requètes surtout ?
Synoyx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2013, 00h18   #7
Rainui
Membre expérimenté
 
Homme Yves TRICHAUD
Technicien bio médical
Inscription : décembre 2012
Messages : 222
Détails du profil
Informations personnelles :
Nom : Homme Yves TRICHAUD
Âge : 29
Localisation : France, Gard (Languedoc Roussillon)

Informations professionnelles :
Activité : Technicien bio médical
Secteur : Santé

Informations forums :
Inscription : décembre 2012
Messages : 222
Points : 543
Points : 543
Citation:
En gros, je peux dans l'outil créer l'objet en insérant X tables dans celui-ci ?
Oui c'est ça. En fait à l'aide d'un concepteur, on peut ajouter, supprimer des DataTables, créer des DataAdapters avec diverses requêtes pour extraire les données. Y ajouter:supprimer des relations, ...

Citation:
Mais comment je peux ensuite utiliser ça ?
Comme vous utilisez n'importe quel objet. On instancie un objet quand on en a besoin. On a un accès à diverses méthodes et propriétés comme avec n'importe quel objet.

Citation:
Pour passer mes requètes surtout ?
Soit en modifiant / ajoutant des requêtes à l'aide du concepteur dans les DataAdapters.
Soit comme vous le faites avec n'importe quel objet, en accédant aux propriétés.

Pour moi qui ne suis pas programmeur, les gros avantages sont que c'est simple d'utilisation, ça réduit le code, c'est pas compliqué à comprendre puisqu'en général le schéma du DataSet correspond à celui de la base de données et pour finir on ne se bat pas avec l'ouverture et fermeture des connections

A si, dernier point que j'aime bien c'est que l'on peut rajouter des champs dans les DataTables.

Sinon pas grande différence avec l'utilisation des objets OleDB, SqlClient, SqlServerCe, ...
__________________
est ton amis, MSDN est ton maître, pour le reste il y a Developpez.net. Pensez au au et
Rainui est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/01/2013, 16h12   #8
Synoyx
Invité de passage
 
Homme Julien
Développeur informatique
Inscription : septembre 2011
Messages : 16
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Bâtiment

Informations forums :
Inscription : septembre 2011
Messages : 16
Points : 4
Points : 4
Ok merci

Je testerai sûrement dans mes applis à venir, mais sur ce projet ça me prendrai trop de temps à adapter mon code pour ça.
Mes updates fonctionnent, donc, avec les requetes sans jointures ! Alors que maintenant je n'ai que ça ( j'ai amélioré mon code .. ). J'ai donc fait quelques recherches, et apparemment je dois créer moi même mes requètes d'update / d'insert et de delete.

J'ai trouvé ça sur le net :

Citation:
SQLServerConnection Conn =
new SQLServerConnection("host=nc-star;port=4100;User ID=test01;
Password=test01;Database Name=Test");

try
{
string selectText = "select sal, job, empno from emp";
string updateText = "update emp set sal = ?, job = ? where empno = ?";
SQLServerDataAdapter adapter = new SQLServerDataAdapter(selectText, Conn);

SQLServerCommand updateCommand = new SQLServerCommand(updateText, Conn);
adapter.UpdateCommand = updateCommand;
updateCommand.Parameters.Add("@sal", SQLServerDbType.Int, 15, "SAL");
updateCommand.Parameters.Add("@job", SQLServerDbType.VarChar, 9, "JOB");
updateCommand.Parameters.Add("@empno", SQLServerDbType.Int, 15, "empno");

DataSet myDataSet = new DataSet("emp");
adapter.Fill(myDataSet, "emp");

// Give employee number 11 a promotion and a raise
DataRow changeRow = myDataSet.Tables["emp"].Rows[11];
changeRow["sal"] = "35000";
changeRow["job"] = "MANAGER";

// Send back to database
adapter.Update(myDataSet, "emp");
myDataSet.Dispose();
}
catch (Exception ex)
{
// Display any exceptions
Console.WriteLine (ex.Message);
}

Console.WriteLine("DataSet Updated Successfully!");

// Close the connection
Conn.Close();

Mais je ne comprends pas le code, à quoi correspondent les @sal, @empno etc ... ?
De plus sont exemple est avec une requête simple, donc je ne visualise déjà pas l'intérêt de faire ça, mais encore moins dans une requête avec jointure ...


Merci !
Synoyx est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 23h04.


 
 
 
 
Partenaires

Hébergement Web