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

C# Discussion :

Update d'un DataAdapter avec un dataset de 3 datables


Sujet :

C#

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2011
    Messages : 47
    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 !

    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 ?

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2012
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2012
    Messages : 337
    Par défaut
    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

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2011
    Messages : 47
    Par défaut
    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

  4. #4
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    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.

  5. #5
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2012
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2012
    Messages : 337
    Par défaut
    Graffito >> Vilain, tu lui as donné la réponse

    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

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2011
    Messages : 47
    Par défaut
    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 ?

  7. #7
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2012
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2012
    Messages : 337
    Par défaut
    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, ...

    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.

    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, ...

  8. #8
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2011
    Messages : 47
    Par défaut
    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 :

    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 !

Discussions similaires

  1. [Débutant] Problème avec un DataAdapter et un DataSet
    Par BleuTrèsFoncé dans le forum Accès aux données
    Réponses: 2
    Dernier message: 08/03/2013, 08h26
  2. Réponses: 6
    Dernier message: 18/06/2006, 00h22
  3. Réponses: 7
    Dernier message: 26/07/2005, 16h41
  4. Réponses: 3
    Dernier message: 21/06/2005, 10h23
  5. UPDATE d'une table avec test d'un champ d'une autre table
    Par delphim dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/05/2004, 12h30

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