none
Comment faire pour mettre à jour mon TABLE RRS feed

  • Question

  • Bonjour a tous,
    j'ai crée un programme qui ouvrir les les tables d'une base de donné access 2003.
    mais j'ai un problème lorsque en clique sur la buttons " Enregistrer les changement"
    je voudrai un code pour mettre à jour la table sélectionné et enregistrement mes changement  lorsque en modifier mon  " DataGridView1".
    voici mon application avec le code source "vb 2008"

    http://www.cdtcl.ma/projet/test/WindowsApplication5.rar
    et merci



     



    • Modifié HappySaid vendredi 16 décembre 2011 13:56
    jeudi 15 décembre 2011 22:36

Réponses

  • Bonsoir

     

    Non,je n'ai pas eu cette erreur du tout mais par contre la base (quand je la réouvre)n'est pas mise à jour.

    Copiez ce code sous votre bouton je l'ai testé et ça marche mais je fixe toujours la première colonne comme ma condition de mise à jour(une sorte de clé)

      Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_enregistrer.Click
            Dim myDA As OleDbDataAdapter
    
            Dim dr_sql As OleDbDataReader
            Dim myDataSet As DataSet
            Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.jet.oledb.4.0;data source=" + TextBox1_chemin.Text)
            Dim cmd As OleDbCommand = New OleDbCommand("SELECT * FROM " + ComboBox1_les_tables.Text, con)
            con.Open()
            myDA = New OleDbDataAdapter(cmd)
            Dim builder As OleDbCommandBuilder = New OleDbCommandBuilder(myDA)
            myDataSet = New DataSet()
            myDA.Fill(myDataSet, ComboBox1_les_tables.Text)
            dr_sql = cmd.ExecuteReader
            Dim i As Int16
            Dim champ, dp, queryupdate As String
            Dim cmdupdate As New OleDb.OleDbCommand
            For Each row As DataGridViewRow In DataGridView1.Rows
    
                For i = 1 To dr_sql.FieldCount - 1
    
                    champ = dr_sql.GetName(i)
    
                    queryupdate = "UPDATE [" & ComboBox1_les_tables.Text & "] SET "
    
                    queryupdate += "[" & champ.ToString.Trim & "]" & " = " & "'" & row.Cells(i).Value.ToString & "'"
    
                    queryupdate += " where [" & dr_sql.GetName(0) & "]" & " = '" & row.Cells(0).Value.ToString & "'"
    
                    cmdupdate = New OleDb.OleDbCommand(queryupdate, con)
                    cmdupdate.ExecuteNonQuery()
    
    
                Next
            Next
            con.Close()
    
    
        End Sub
    

    Bon Travail


    Cordialement

     


    Best Regards...Please mark as answer if my post is helpful
    dimanche 18 décembre 2011 20:29

Toutes les réponses

  • Bonjour,

     

    Sous votre bouton enregistre mettez ce code:

    Private Sub save_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles save.Click
            Dim designaton As String = myDataSet.Tables(0).Rows(DataGridView1.CurrentRow.Index)("code").ToString()
            cmd = New SqlCommand("Update table1 Set field1 = @field1 where code ='" & designaton & "'", con)
            cmd.Parameters.AddWithValue("@field1", myDataSet.Tables(0).Rows(DataGridView1.CurrentRow.Index)("field1").ToString())
            If con.State = ConnectionState.Closed Then con.Open()
            Try
                cmd.ExecuteNonQuery()
               ' bind the data
    
            Catch ex As SqlException
                
            End Try
    


    Paramétrez ce code avec autant de champ que vous voulez et l'edition de valeur se fait par ligne sur le datagridview lui meme.

     

    Cordialement


    Best Regards...Please mark as answer if my post is helpful
    vendredi 16 décembre 2011 08:44
  • Bonjour, YosrJ
    ce code ne marche pas sur mon application
    voici mon application avec le code source "vb 2008"

    http://www.cdtcl.ma/projet/test/WindowsApplication5.rar
    et merci

    vendredi 16 décembre 2011 12:38
  • Biensur ça marcherais pas puisque déja ton provider est oledb 

    Mets ce bout de code sous ton événement click bouton et fait moi signe si ça marche pas

     

     Dim myDA As OleDbDataAdapter
                Dim myDataSet As DataSet
                Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.jet.oledb.4.0;data source=" + TextBox1_chemin.Text)
                Dim cmd As OleDbCommand = New OleDbCommand("SELECT * FROM " + ComboBox1_les_tables.Text, con)
                con.Open()
                myDA = New OleDbDataAdapter(cmd)
                Dim builder As OleDbCommandBuilder = New OleDbCommandBuilder(myDA)
                myDataSet = New DataSet()
                myDA.Fill(myDataSet, ComboBox1_les_tables.Text)
                Dim dp As String = myDataSet.Tables(0).Rows(DataGridView1.CurrentRow.Index)("dp").ToString()
                Dim cmdupdate As OleDbCommand = New OleDbCommand("Update " & ComboBox1_les_tables.Text & " Set civilisation = @civilisation where DP ='" & dp & "'", con)
                cmdupdate.Parameters.AddWithValue("@civilisation", myDataSet.Tables(0).Rows(DataGridView1.CurrentRow.Index)("civilisation").ToString())
                ' tu met autant de champs que t'as dans la grille
                cmdupdate.ExecuteNonQuery()
              
                DataGridView1.DataSource = myDataSet.Tables(ComboBox1_les_tables.Text).DefaultView
                con.Close()
            Catch ex As OleDbException
                MsgBox(ex.Message)
              
            End Try
    
    
    

    Cordialement

     

     


    Best Regards...Please mark as answer if my post is helpful
    • Modifié YosrJ vendredi 16 décembre 2011 12:56
    vendredi 16 décembre 2011 12:55
  • message error :

    Column 'dp' does not belong to table Table_avancement.

    vendredi 16 décembre 2011 13:00
  • tu devrais mettre tes colonnes de  table_avancement ou de chaque table que tu veux mettre à jour

    le Rows(DataGridView1.CurrentRow.Index)("dp") 

    ou Rows(DataGridView1.CurrentRow.Index)("civilsiation") veut dire accéder à ce champs de la table 

    Mais à ce que je vois la table varie selon ton combobox donc une approche avec indice serait plus fiable et tu devrais construire ta requete update 


     

     


    Best Regards...Please mark as answer if my post is helpful

    • Modifié YosrJ vendredi 16 décembre 2011 13:08
    vendredi 16 décembre 2011 13:04
  • essayez cette méthode plus simple:

     

     Dim myDA As OleDbDataAdapter
                Dim myDataSet As DataSet
                Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.jet.oledb.4.0;data source=" + TextBox1_chemin.Text)
                Dim cmd As OleDbCommand = New OleDbCommand("SELECT * FROM " + ComboBox1_les_tables.Text, con)
                con.Open()
                myDA = New OleDbDataAdapter(cmd)
                Dim builder As OleDbCommandBuilder = New OleDbCommandBuilder(myDA)
                myDataSet = New DataSet()
                myDA.Fill(myDataSet, ComboBox1_les_tables.Text)
               
     myDA.Update(myDataSet, ComboBox1_les_tables.Text)
    



    Best Regards...Please mark as answer if my post is helpful
    vendredi 16 décembre 2011 13:25
  • Je m'excuse YosrJ , mais cela ne fonctionne pas aussi !!
    avez-vous téléchargé l'application avec le code source  ? Vous pouvez remarquer l'erreur ?

    • Modifié HappySaid vendredi 16 décembre 2011 14:06
    vendredi 16 décembre 2011 14:05
  • Oui Je l'ai meme executé et c'est vrai la table ne se mets pas à jour

    Donc L'idée est de parcourir tout les champs d'une table par un datareader par  exemple et de construire la requetre update partie par partie.Donc tu utilise le premier code .

    Je posterais une solution dès que possible avec une boucle de parcours sur les champs de la table qui varie 

     


    Best Regards...Please mark as answer if my post is helpful
    vendredi 16 décembre 2011 14:20
  • Essayez ce code qui utilise GetName du datareader 

    GetName permet de récupérer le nom du champ de la table variante

     

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_enregistrer.Click
            Dim myDA As OleDbDataAdapter
            Dim dr_sql As OleDbDataReader
            Dim myDataSet As DataSet
            Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.jet.oledb.4.0;data source=" + TextBox1_chemin.Text)
            Dim cmd As OleDbCommand = New OleDbCommand("SELECT * FROM " + ComboBox1_les_tables.Text, con)
            con.Open()
            myDA = New OleDbDataAdapter(cmd)
            Dim builder As OleDbCommandBuilder = New OleDbCommandBuilder(myDA)
            myDataSet = New DataSet()
            myDA.Fill(myDataSet, ComboBox1_les_tables.Text)
            dr_sql = cmd.ExecuteReader
            Dim i As Int16
            Dim champ, dp As String
            Dim cmdupdate As OleDbCommand = New OleDbCommand
            Do While dr_sql.Read
                For i = 1 To dr_sql.FieldCount - 1
                    champ = dr_sql.GetName(i)
                    dp = myDataSet.Tables(0).Rows(DataGridView1.CurrentRow.Index)(dr_sql.GetName(0)).ToString()
                    cmdupdate.Connection = con
                    cmdupdate.CommandType = CommandType.Text
                    cmdupdate.CommandText = "Update  " & ComboBox1_les_tables.Text & "  Set  " & champ.ToString.Trim & "  =" & "'" & myDataSet.Tables(0).Rows(DataGridView1.CurrentRow.Index)(dr_sql.GetName(i)).ToString & "'" & "   where  " & dr_sql.GetName(0).Trim & "  =" & "'" & dp & "'"
                    cmdupdate.ExecuteNonQuery()
    
                Next
    
            Loop
    
    
            DataGridView1.DataSource = myDataSet.Tables(ComboBox1_les_tables.Text).DefaultView
            con.Close()
           
    
        End Sub
    


     


    Best Regards...Please mark as answer if my post is helpful
    • Modifié YosrJ vendredi 16 décembre 2011 15:46
    vendredi 16 décembre 2011 15:44
  • est ce que vous avez essayé ? cela n'a pas fonctionné pour moi
    voici le problème


    vendredi 16 décembre 2011 18:47
  • Bonsoir

     

    Non,je n'ai pas eu cette erreur du tout mais par contre la base (quand je la réouvre)n'est pas mise à jour.

    Copiez ce code sous votre bouton je l'ai testé et ça marche mais je fixe toujours la première colonne comme ma condition de mise à jour(une sorte de clé)

      Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_enregistrer.Click
            Dim myDA As OleDbDataAdapter
    
            Dim dr_sql As OleDbDataReader
            Dim myDataSet As DataSet
            Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.jet.oledb.4.0;data source=" + TextBox1_chemin.Text)
            Dim cmd As OleDbCommand = New OleDbCommand("SELECT * FROM " + ComboBox1_les_tables.Text, con)
            con.Open()
            myDA = New OleDbDataAdapter(cmd)
            Dim builder As OleDbCommandBuilder = New OleDbCommandBuilder(myDA)
            myDataSet = New DataSet()
            myDA.Fill(myDataSet, ComboBox1_les_tables.Text)
            dr_sql = cmd.ExecuteReader
            Dim i As Int16
            Dim champ, dp, queryupdate As String
            Dim cmdupdate As New OleDb.OleDbCommand
            For Each row As DataGridViewRow In DataGridView1.Rows
    
                For i = 1 To dr_sql.FieldCount - 1
    
                    champ = dr_sql.GetName(i)
    
                    queryupdate = "UPDATE [" & ComboBox1_les_tables.Text & "] SET "
    
                    queryupdate += "[" & champ.ToString.Trim & "]" & " = " & "'" & row.Cells(i).Value.ToString & "'"
    
                    queryupdate += " where [" & dr_sql.GetName(0) & "]" & " = '" & row.Cells(0).Value.ToString & "'"
    
                    cmdupdate = New OleDb.OleDbCommand(queryupdate, con)
                    cmdupdate.ExecuteNonQuery()
    
    
                Next
            Next
            con.Close()
    
    
        End Sub
    

    Bon Travail


    Cordialement

     


    Best Regards...Please mark as answer if my post is helpful
    dimanche 18 décembre 2011 20:29
  • Bonjour, HappySaid,

     

    Est-ce que vous avez testé la dernière solution proposée par YosrJ ? Merci de partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.

     

    Cordialement,

     

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    lundi 19 décembre 2011 10:17
  • le code n'a pas fonctionné  !!! car je ne sais pas comment fixé toujours la première colonne comme la condition de mise à jour
    mardi 20 décembre 2011 16:46
  • Bonjour,

    Le code est fonctionnel !

    Pour mettre à jour une ligne quelque soit il nous faut une condition sinon ça mettra les memes valeurs dans toutes lignes dans ton datagridview.

    Une table dans une base de donnée nécessite une clé primaire .ou au moin un code pour désigner une ligne pour qu'elle soit unique .

    Ajouter une clé primaire dans chacun de  vos tables et le code fonctionnera à merveille

     

    Cordialement

     


    Best Regards...Please mark as answer if my post is helpful
    vendredi 23 décembre 2011 13:14
  • oui j'ai copier votre code complétement, mais je voudrais savoir qu'est-ce que cela signifie le variable dp
    voici le code d'erreur : " Type de données incompatible dans l'expression du critère. "


    et voici la table

    s'il était possible envoyer moi le projet et votre exemple de base de donnée et merci

    samedi 24 décembre 2011 13:12