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 :

Mise a jour Base Access via DataSet


Sujet :

Accès aux données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 163
    Par défaut Mise a jour Base Access via DataSet
    Bonjour le Forum,

    Bon je manipule un DatagridView que l'utilisateur remplie en fonction de critères de sélection. Un foi le datagridView remplit, il peut modifier ou pas le contenue du datagridView directement dessus. Si il le modifie, je sais que le DataSet est mis a jour automatiquement car le DataGridView et le DataSet sont liés. Maintenant, je voudrais répercuter les modification dans ma Base Access.

    Pour cela je fais ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            'J'ouvre la connection avec ma Base Access
            CsV.strconn = "Provider=Microsoft.ACE.OLEDB.12.0;Data source = C:\Documents and Settings\vratouis\Desktop\Time Tracking\Base2.accdb"
            Dim cn As New OleDbConnection(CsV.strconn)
            cn.Open()
     
            adp.Update(ds, "MaTable")
            cn.Close()
    Mais ça ne marche pas.

    Pourtant j'ai suivi le cours de Mr Plasserre qui dit, dans le Chapitre 6-6 Partie B "Remplir un DataGrid avec Base de Données via un DataSet", que pour mettre a jour la base access si on fait une modification dans le DataGrid il faut mettre tout simplement dans le bouton mise a jour juste cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ObjetDataAdapter.Update(ObjetDataSet, "NomDataTable")
    Qd je lance mon code j'ai cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OleDbCommand.Prepare method requires all parameters to have an explicitly set type.
    Donc j'en conclue d'après ce message d'erreur qu'il faut redéclarer un objet Commande et de le passer en argument au OleDbAdapter. Mais le problème si je déclare un objet Command il faut que je lui passe en paramètre une requête SQL et ma connexion. Mais je n'ai pas de requête... Donc comment je fais?

    Voici le code avec les déclarations mais incomplètes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            CsV.strconn = "Provider=Microsoft.ACE.OLEDB.12.0;Data source = C:\Documents and Settings\vratouis\Desktop\Time Tracking\Base2.accdb"
            Dim cn As New OleDbConnection(CsV.strconn)
            ' Dim comm As New OleDbCommand('????????)
     
            adp = New OleDbDataAdapter '(la normalement il doit y avoir comm)
            builder = New OleDbCommandBuilder(adp)
            cn.Open()
            adp.Update(ds, "XL")
            cn.Close()
    Et en compilant j'ai ce message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    The DataAdapter.SelectCommand property needs to be initialized.
    Mais comment l'initialiser?

    Le pire c'est que dans tous les sites internet que j'ai visité, il disent tous il faut juste mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MondataAdapter.Update(MonDataSet, "MaDataTable")
    Mais ça ne marche pas.... C'est a n'y rien comprendre.

    J'ai certainement pas du comprendre un truc...

    Donc si quelqu'un pouvait me mettre sur la bonne voie je lui en serai tres reconnaissant.

    Merci d'avance et bonne journée.

    Cordialement,
    Vincent

  2. #2
    Membre éprouvé
    Avatar de debug
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    1 034
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 034
    Par défaut
    Il faut lui dire quelle est la requête à exécuter.

    Pour la définir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MondataAdapter.UpdateCommand = "ma requete d'update";

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 163
    Par défaut
    Salut debug,

    Merci pour ta réponse et de prendre un peut de temps su r mon sujet.

    Alors j'ai vu effectivement qu'il fallait passer par les Command du DataAdapter.
    Je me suis documenté mais ça ne résout pas mon pb...
    Dans ce cas il faut intégrer au Form des Text box et autre control afin de construire la requête qui sera comme paramètre a la Command du DataAdapter. L'utilisateur remplit ces control et clique sur Update si Update il y a et la ça fonctionne.

    Mais dans mon cas je ne veux aucun textBox, aucun control, juste mon utilisateur, mon DatagridView et un bouton. L'utilisateur modifie le Datagrid directement dessus, ce qui modifie le DataSet en même temps.
    Et dans le bouton il y a le code qui permettra le passage entre le DataSet et la Base de donnée par le biais du DataAdapter.

    Parce que j'ai le soucis d'essayer de rendre les choses le plus simple possible pour les utilisateurs. Et la le fait de modifier directement dans le DataGrid c'est relativement simple d'utilisation.

    Peut être que ce que je ceux faire n'est pas possible? Ou il est probable que je n'ai pas encore bien compris le principe du DataAdapter dans le sens DataSet->Base de donnée.

    Voila je suis toujours en mode recherche et d'épluchage de site internet afin de trouver solution a mon pb... mais sans succès pour le moment...

    Voila si tu as une idée Forum ou toi debug sur la façon de procéder, un cours ou un tuto qui explique comment faire je suis preneur.

    En tout cas Merci pour ton aide

    Bonne journée

    Vincent

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    374
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 374
    Par défaut
    Bonjour,
    Pour que l'update fonctionne il faut que les requêtes(update,select, insert, delete) du dataadapter soient crées.
    Le plus facile est d'utiliser l'assistant de création d'une table qui va générer automatiquement ces requêtes.

    Une autre solution, mais qui demande plus de code, est d'utiliser un objet command et de lui passer la requête de mise à jour.
    La procédure consiste à récupérer les lignes modifiées de la table avec un dataview.RowStateFilter.
    Pour chaque type de mise à jour (insert,update,delete) créér le texte de la requête (avec l'utilisation des paramètres pour les champs à traiter).
    Exécuter la requête avec la propriété execnonquery de l'objet command.
    Cette procédure est plus longue mais te permet de mieux gérer la mise à jour.
    D'ailleurs si tes tables ont des relations "clé étrangère", la mise à jour via le dataadapter risque de ne pas fonctionner(intégrité référentielle).
    Bon boulot Jean

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 163
    Par défaut
    Salut JPelli, le Forum

    Alors merci pour tes conseils.... Je suis tombé sur un cours celui de J-M Rabilloud sur ADO.Net, et dans la partie Stratégies de Mise a jour, il explique comment créer les Command du DataAdapter. Je pars donc vers ta deuxièmes méthode (plus fastidieuse certes mais plus sure...)

    Qd tu dis:
    La procédure consiste à récupérer les lignes modifiées de la table avec un dataview.RowStateFilter.
    La table dont tu parles c'est mon dataTable?

    J'ai suivit son cours et j'ai créer trois Fonctions pour chaque type de Mise a jour (Delete-Insert-Update) avec les requêtes paramétrées adéquates. Ca c'est fait et c'était pas trop compliqué...

    Ensuite c'est la ou ça se complique:
    Je me suis renseigné sur le dataview.RowStateFilter. Si j'ai bien compris c'est une sorte de Filtre qui mémorise les modifications faites dans le DataSet et fait le lien entre le dataSet et le DataAdapter. Ensuite, on peut alors utiliser les Command de mise a jour du DataAdapter et mettre a jour la table de données. C'est bien ca?

    Bon si c'est ca dans mon bouton "Mise a jour" dans mon formulaire, il faut que je déclare un objet Commande et un dataView mais comment l'utiliser? Dans l'aide en ligne de VB 2008 Express il mette ça comme exemple pour choper les lignes modifiées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            Dim dataView As New DataView(dataTable)
     
            DataView.RowStateFilter = _
    DataViewRowState.Added Or DataViewRowState.ModifiedCurrent
    après je mets les propriété Command au DataSet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MonDataSet.UpdateCommand = MaCommande
    MonDataSet.InsertCommand = MaCommande
    MonDataSet.DeleteCommand = MaCommande
    Et la il faut exécuter la requête avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MaCommande.ExecuteNonQuery()
    Le truc c'est que je ne sais pas trop quoi mettre et surtout dans le quel ordre?

    Ensuite comment sait on le type de requête qui a été exécutée?

    J'avoue que je suis complètement perdu...

    Si une âme généreuse pouvait m'aider

    Merci d'avance et bonne journée...

    Vincent

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    374
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 374
    Par défaut
    Bonjour,
    Voici un petit exemple
    Dans ce cas j'utilise une procédure stockée pour chaque type de mise à jour
    Procédure de mise à jour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    ......
    dim DTAV as dataview
    DTAV.Table = DS.TGRPCODES      'table parent
    DTAV.RowStateFilter = DataViewRowState.Added Or
          DataViewRowState.Deleted Or DataViewRowState.ModifiedCurrent
            For Each DTARV In DTAV
            Select Case DTARV.Row.RowState
              Case DataRowState.Added
                S_InsertTGRPCODES(SQLCMDGrp, DTARV)
                
    'mise à jour de la table enfant
                DTAR = DTARV.Row
                DTAREnfS = DTAR.GetChildRows("TGRPCODES_TCODMED")
                For Each DTAREnf In DTAREnfS
                  DTAREnf.Item(2) = NumGrp
                  S_InsertTCODMED(SQLCMDCod, DTAREnf)  
              Next
            case DataRowState.Deleted
     ...
            End Select
          Next
          SQLCON.Close()
    procédure ajout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub S_InsertTGRPCODES(ByRef SQLCMD As SqlClient.SqlCommand, ByVal DTARV As DataRowView)
           S_CreerParamInsUptTGRPCODES(SQLCMD)   'créer les paramètres
           S_ValueParamInsUptTGRPCODES(SQLCMD, DTARV)   'maj des paramètres
          SQLCMD.CommandText = "ProcInsertTGRPCODES"     'procédure stockées
             sqlcmd.ExecQuery
        End Sub
    procédure création des paramètres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     Public Sub S_CreerParamInsUptTGRPCODES(ByRef SQLCMD As SqlClient.SqlCommand)
     
          SQLCMD.Parameters.Clear()
        SQLCMD.CommandType = CommandType.StoredProcedure
        With SQLCMD.Parameters
          .Add(New SqlClient.SqlParameter("@Ett", SqlDbType.VarChar, 6))
          .Add(New SqlClient.SqlParameter("@DatHist", SqlDbType.DateTime))
          .Add(New SqlClient.SqlParameter("@NumGrp", SqlDbType.Int))
          .Add(New SqlClient.SqlParameter("@MemoGrp", SqlDbType.VarChar, 10))
          .Add(New SqlClient.SqlParameter("@LibGrp", SqlDbType.VarChar, 50))
          .Add(New SqlClient.SqlParameter("@UtilModif", SqlDbType.VarChar, 20))
        End With
    procédure de mise à jour des paramètres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Sub S_ValueParamInsUptTGRPCODES(ByRef SQLCMD As SqlClient.SqlCommand, ByVal DTARV As DataRowView)
        With SQLCMD
          .Parameters("@Ett").Value = DTARV.Item(0).ToString.Trim
          .Parameters("@DatHist").Value = DTARV.Item(1)
          .Parameters("@NumGrp").Value = CInt(DTARV.Item(2).ToString)
          .Parameters("@MemoGrp").Value = DTARV.Item(3).ToString.Trim
          .Parameters("@LibGrp").Value = DTARV.Item(4).ToString.Trim
          .Parameters("@UtilModif").Value = DTARV.Item(5).ToString.Trim
        End With
    Dans la procédure insert, je mets à jour 2 tables avec une relation donc le dois mettre à jour la table(TGRPCODES) parent et ensuite la table(TCODMED) enfant.
    J'espère que cela t'aideras, n'hésite pas à poser des questions.
    Bon boulot Jean

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

Discussions similaires

  1. [AC-2007] Mise a jour base Access
    Par Aladin_23 dans le forum VBA Access
    Réponses: 6
    Dernier message: 12/05/2010, 21h25
  2. mise a jour base de donnée access
    Par Razielone dans le forum C#
    Réponses: 5
    Dernier message: 28/03/2008, 08h43
  3. [mise a jour] base de donnée access
    Par escobar dans le forum Access
    Réponses: 11
    Dernier message: 17/07/2006, 10h12
  4. Module de Mise à jour BDD access via un site sécurisé
    Par Askarod dans le forum Bases de données
    Réponses: 3
    Dernier message: 08/12/2005, 08h31
  5. Mise à jour base access->mysql impossible... :-(
    Par pako69 dans le forum Administration
    Réponses: 4
    Dernier message: 26/09/2005, 14h51

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