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 :

[ADO.NET] MAJ BDD à partir d'un DataSet d'un DataGrid


Sujet :

Accès aux données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 262
    Points : 100
    Points
    100
    Par défaut [ADO.NET] MAJ BDD à partir d'un DataSet d'un DataGrid
    Bonjour à tous,

    Je cale sérieusement sur ce problème.
    J'ai un datagrid qui prend en datasource un dataset qui contient plusieurs datatables reliées par des relations.

    Le datagrid (avec les relations) se charge parfaitement. Je voudrais maintenant permettre de modifier des données dans le datagrid pour ensuite mettre à jour la base de données.

    J'ai parcouru plusieurs docs qui me disent qu'il faut définir l'UpdateCommand, InsertCommand et DeleteCommand du dataAdapter.
    Mais comment les faire ?

    A la validation des changements, est-ce que je dois parcourir tout le datagrid pour renvoyer les valeurs et renseigner des paramètres que j'aurais créé comme ici ?
    http://dotnet.developpez.com/tutoriels/ado2/vbnet/
    http://msdn.microsoft.com/library/fr...terdataset.asp

    J'ai lu ailleurs qu'il suffisait de faire ceci :

    DataGrid1.Update()
    Dim ds As DataTable = CType(DataGrid1.DataSource, DataTable)
    BDD.getDataAdapter.Update(ds)
    J'ai absolument besoin de le faire sur plusieurs datatables liées.
    Auriez-vous un tuto ou un exemple concret sur lequel je pourrais m'appuyer ? (C# ou VB)

    Merci d'avance.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 72
    Points : 38
    Points
    38
    Par défaut Re: Mise à jour d'une BDD à partir d'un dataset d'une datagr
    Citation Envoyé par bart64
    Bonjour à tous,

    Je cale sérieusement sur ce problème.
    J'ai un datagrid qui prent en datasource un dataset qui contient plusieurs datatables reliées par des datarelations.

    Le datagrid (avec les relations) se charge parfaitement. Je voudrais maintenant permettre de modifier des données dans le datagrid pour ensuite mettre à jour la base de données.

    J'ai parcouru plusieurs docs qui me disent qu'il faut définir l'UpdateCommand, InsertCommand et DeleteCommand du dataAdapter.
    Mais comment les faire ?

    A la validation des changements, est-ce que je dois parcourir tout le datagrid pour renvoyer les valeurs et renseigner des paramètres que j'aurais créé comme ici ?
    http://dotnet.developpez.com/tutoriels/ado2/vbnet/
    http://msdn.microsoft.com/library/fr...terdataset.asp

    J'ai lu ailleurs qu'il suffisait de faire ceci :

    DataGrid1.Update()
    Dim ds As DataTable = CType(DataGrid1.DataSource, DataTable)
    BDD.getDataAdapter.Update(ds)
    J'ai absolument besoin de le faire sur plusieurs datatables liées.
    Auriez-vous un tuto ou un exemple concret sur lequel je pourrais m'appuyer ?

    Merci d'avance.
    Salut,

    Je viens de passer 1-2 jours dessus de mon côté. J'avais 17 tables à cherger et à pouvoir modifier dans une dataGrid.

    Un conseil : définis tes dataAdapter en mode design et tout sera fait automatiquement.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 262
    Points : 100
    Points
    100
    Par défaut
    Merci maredami pour ta réponse !

    J'ai voulu commencer par le mode design mais au moment de la génération de la requête, ça bloque parce que je sélectionne plus de 255 champs
    J'utilise une base access, ce qui me limite... Je suis donc obligé de passer par le code.

  4. #4
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par bart64
    Merci maredami pour ta réponse !

    J'ai voulu commencer par le mode design mais au moment de la génération de la requête, ça bloque parce que je sélectionne plus de 255 champs
    J'utilise une base access, ce qui me limite... Je suis donc obligé de passer par le code.
    une Table access avec 255 champs , ya pas un souci là :
    Bon sinon fais le test suggéré en mode design sur une table plus petite et tu verras ainsi comment ont été généré automatiquement toutes les requêtes paramétrées
    Mais bonjour sur 255 champs

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 262
    Points : 100
    Points
    100
    Par défaut
    Salut Neguib,

    Eh oui, en fait, je n'ai pas 1 seule table mais 28 tables avec pour chaque entre 10 et 150 champs
    Lorsque je génère en mode design, il impose de tout importer en une seule requête. Donc je dépasse très vite les 255 champs.

    fais le test suggéré en mode design
    OK, je vais regarder de ce côté là.
    Merci, @+

  6. #6
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    En fait dans ton cas de figure il peut y avoir plutôt 28 dataAdapters soit un pour chacune de tes tables, puis ensuite tu peux faire générer le groupe de données dans un DataSet fortement typé

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 262
    Points : 100
    Points
    100
    Par défaut
    Merci,

    J'avais remarqué que les commandes insert et update ne pouvaient pas être générées si plusieurs tables sont liées.
    Je vais essayer de créer un dataset fortement typé. Je crois que cette doc peut m'aider
    http://msdn.microsoft.com/library/fr...peddataset.asp

    Je ne vois pas trop comment relier mais DataAdaptermais je vais fouiller un peu.
    Merci beaucoup!

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 262
    Points : 100
    Points
    100
    Par défaut
    Merci Neguib !
    Ton aide m'a été très précieuse, ça fonctionne parfaitement.

    A bientôt !

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 262
    Points : 100
    Points
    100
    Par défaut
    Bon, en fait, j'en ai pas fini avec mon problème.
    J'ai une table avec plus de 101 champs, 101 car le dataAdapter accèpte 100 champs et un dernier pour la clé primaire.
    Sinon, en mode design, VS 2003 ne peut pas générer les commandes INSERT, UPDATE et DELETE.
    Je n'ai pas la possibilité de réduire le nombre de champs de la table !

    J'ai trouvé le moyen de créer deux dataAdapters, le premier récupère la moitié des champs de la table, le second l'autre moitié. Puis je crée une relation entre ces deux DA. Mais le datagrid ne met pas les données sur la même ligne... Je ne peux pas laisser comme ça ...

    Je suis enfin passé par le code où j'ai généré toutes les commandes SQL à la mano, c'est trèèès long !
    Tout ça pour que l'appli me lève l'exception suivante : "La requête est trop complexe"

    Est-ce que j'ai tout essayé ? Est-ce vraiment impossible ?
    Je suis désespéré .......

  10. #10
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par bart64
    ....J'ai trouvé le moyen de créer deux dataAdapters, le premier récupère la moitié des champs de la table, le second l'autre moitié. Puis je crée une relation entre ces deux DA. Mais le datagrid ne met pas les données sur la même ligne... Je ne peux pas laisser comme ça ...
    oui mais là est le début d'une solution car je suppose que les deux tables remplies par les 2 DataAdapter ont bien un champs commun (la clé primaire). Donc plus de soucis vis à vis des données il ne te reste plus qu'à résoudre un aspect design et c'est tout autre chose
    Intuitivement, pour l'affichage, je passerai par une DataTable intermédiaire qui opère la fusion des 2 DataTables plutôt qu'une DataRelation
    Bon en même temps çà devient pour l'utilisateur quelquepeu usine à gaz ton histoire de grand nombre de champs, je me demande bien ce qui justifie 150 champs. Des connaisseurs Access devraient essayer de nous eclairer quant à ce type de construction de données.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 262
    Points : 100
    Points
    100
    Par défaut
    OK, mais en pratique, comment dois-je m'y prendre ?
    J'ai dû créer un dataset fortement typé à cause de mes problèmes précédents. Je l'ai réalisé en mode design avec l'utilitaire "Générer le groupe de données" de VS2003. Ceci m'a créé un fichier d'extension xsd.

    Est-ce que cela veut dire que je dois me recréer un fichier xsd à la main, créer une datatable de toute pièce en y insérant les enregistrements du 1er et du 2e Da, que je définisse une méthode "Update" de la dataTable qui appelle les Update de chacun des deux dataAdapters, etc ... Mais comment spécifier au dataset fortement typé qu'une dataTable créée dynamiquement va s'y insérer ?

    Désolé, je suis très brouillon mais je ne vois pas trop comment faire.

    Merci, vraiment merci pour ton aide !

  12. #12
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 262
    Points : 100
    Points
    100
    Par défaut
    Yes ! Merci !
    J'essaie ça dès demain.

    Si ça résoud mon problème, t'es vraiment le plus fort Neguib !
    Je te donne de toute manière des nouvelles.

    A+

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 262
    Points : 100
    Points
    100
    Par défaut
    Je reviens un peu moins optimiste.

    Je me suis servi de la méthode Merge, ça fonctionne parfaitement, le dataGrid fusionne bien mes deux datatables.
    Par contre, ça pose problème pour la méthode Update du dataAdapter de la deuxième moitié de table : il se mélange les pinceaux et ne peut pas mettre à jour la deuxième partie de table.

    J'ai également essayé ceci au moment de la màj :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
                Dim dsRes As DataSet = CType(Table.DataSource, DataSet)
     
                DaS10_G01_00.Update(dsRes)
                DaS10_G01_01.Update(dsRes)
                DaS20_G01_00.Update(dsRes)
                DaS30_G01_00.Update(dsRes)
                'DaS41_G01_00.Update(dsRes)
     
                DaS41_G01_00_PartII.AcceptChangesDuringFill = False
                DataSet31.Merge(dsRes.Tables("S41_G01_00"), True, MissingSchemaAction.Add)
                Console.WriteLine(dsRes.HasChanges)
                Console.WriteLine(DataSet31.HasChanges)
                DaS41_G01_00_PartII.Update(DataSet31)
    Si, comme au-dessus, je laisse cette ligne en commentaire (màj de la première partie de table)
    'DaS41_G01_00.Update(dsRes)
    l'appli mouline une bonne trentaine de secondes et l'update passe. J'ai
    dsRes.HasChanges qui vaut True
    DataSet31.HasChanges qui vaut True
    Mais rien n'est mis à jour !

    Si je remet DaS41_G01_00.Update(dsRes) (màj de la première partie de table), j'obtiens l'exception Conccurency violation : the UpdateCommand affected 0 records.

    Mais je me demande si cette méthode poura fonctionner. Si je rajoute une ligne dans la dataGrid, le 1er DA va créer la ligne avec la première moitié des données car dsRes aura la propriété HasChanges à True.
    Mais DaS41_G01_00_PartII.HasChanges aura aussi la valeur à True. Il voudra ensuite créer une ligne avec la même valeur de PK. Ca risque de planter.

    Mais de toute manière, ça ne fonctionne pas du tout.

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 168
    Points : 123
    Points
    123
    Par défaut
    Je suis dans le même cas que toi (plus de 101 champs) et j'ai commencé à faire mon DataAdapter.

    Pour l'instant je fais juste la partie update, je lui passe un DataSet, une table.
    Je parcours les Rows "modified/interted/deleted" et je génère la requete approprié à chaque status et je l'execute.

    Pour l'instant l'insert fonctionne, je continu le reste...
    Je postais juste pour te donner cette solution

    Bonne continuation

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 262
    Points : 100
    Points
    100
    Par défaut
    Merci Alexandre !
    Je n'avais pas vu ta réponse. J'ai réussi à contourner le problème en créant quatre requêtes stockées dans Access (une pour le select, une pour l'insert, etc ...).
    Ca fonctionne parfaitement !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Me.OleDbSelectCommand6.CommandType = CommandType.StoredProcedure
    Me.OleDbSelectCommand6.CommandText = "selectForGrid"
    Me.OleDbSelectCommand6.Connection = Me.OleDbConnection1
    Pour les autres requêtes, j'ai créé des paramètres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
               Me.OleDbInsertCommand6.CommandType = CommandType.StoredProcedure
                Me.OleDbInsertCommand6.CommandText = "insereGrid"
     
                Me.OleDbInsertCommand6.Connection = Me.OleDbConnection1
                Me.OleDbInsertCommand6.Parameters.Add(New System.Data.OleDb.OleDbParameter("_01", System.Data.OleDb.OleDbType.VarWChar, 50, "001"))
                Me.OleDbInsertCommand6.Parameters.Add(New System.Data.OleDb.OleDbParameter("_02_001", System.Data.OleDb.OleDbType.VarWChar, 50, "002_001"))
     etc ...
    Il n'y a aucun souci, tout fonctionne comme je le veux.

    Peut-être que ça te permettra d'avancer plus vite car c'est long !

    Merci pour tout et bon courage ! Et merci à Neguib pour sa patience !
    Si tu tentes ma méthode et que tu as un problème, fais moi signe .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Update Bdd à partir d'un dataset
    Par NejNej dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/11/2009, 14h54
  2. Réponses: 1
    Dernier message: 23/09/2008, 14h50
  3. [ADO.NET]Connaitre les tables d'un dataset
    Par bicho dans le forum Accès aux données
    Réponses: 2
    Dernier message: 21/02/2007, 10h44
  4. [ADO.NET 2.0] BLL / Classe Partiel DataSet Typé
    Par stephane.net dans le forum ASP.NET
    Réponses: 2
    Dernier message: 22/01/2007, 08h58
  5. [ADO.NET][C#] Comment recupérer contraintes dans Dataset ?
    Par irnbru dans le forum Accès aux données
    Réponses: 2
    Dernier message: 11/02/2006, 00h53

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