none
Commande UPDATE RRS feed

  • Question

  • Bonjour,

    J'ai une Form qui affiche à gauche la liste des enregistrements d'une table et à droite les données correspondant à l'enregistrement choisi à gauche. Je joins une image de la Form plus bas, avec le code.

    La procédure UpdateRecord ne fonctionne pas. Rien n'est enregistré mais il n'y a pas de message d'erreur.

    1. Ou est l'erreur dans UpdateRecord?

    2. Quel code dois-je mettre dans la procédure AddRecord?

    3. Quel code dois-je mettre dans la procédure DeleteRecord?

    4. Si vous avez des suggestions pour améliorer et simplifier mon code, je suis preneur.

    Merci


    Option Strict Off

    Imports System.Data
    Imports System.Data.OleDb

    Public Class Form1

        Private DataPath As String = CStr(My.Computer.Registry.GetValue("HKEY_CURRENT_USER\Software\VB and VBA " & _
                                                  "Program Settings\ConseilAdministration", "DataPath", ""))

        Private conConseil As OleDb.OleDbConnection
        Private daMembres As OleDbDataAdapter
        Private dsMembres As DataSet
        Private dvMembres As DataView

        Private Sub FMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            If GetData() Then
                BindData()
            Else
                End
            End If
        End Sub

        Private Sub FMain_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) _
                                      Handles Me.FormClosing

            UpdateRecord()

        End Sub

        Private Sub Boutons_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
                                  Handles btnNouveau.Click, btnSupprimer.Click, btnImprimer.Click

            Select Case sender.Name
                Case "btnNouveau"
                    AddRecord()
                Case "btnSupprimer"
                    DeleteRecord()
            End Select

        End Sub

        Private Sub AddRecord()

        End Sub

        Private Sub BindData()

            lstMembres.DataSource = dvMembres
            lstMembres.DisplayMember = "ClasserSous"

            cboTitre.DataBindings.Add(New Binding("Text", dvMembres, "Titre"))
            txtPrenom.DataBindings.Add(New Binding("Text", dvMembres, "Prenom"))
            txtNom.DataBindings.Add(New Binding("Text", dvMembres, "Nom"))
            txtOccupation.DataBindings.Add(New Binding("Text", dvMembres, "Occupation"))
            txtAdresse1.DataBindings.Add(New Binding("Text", dvMembres, "Adresse1"))
            txtLocalite.DataBindings.Add(New Binding("Text", dvMembres, "Localite"))
            txtCodePostal.DataBindings.Add(New Binding("Text", dvMembres, "CodePostal"))
            txtLibTelephone1.DataBindings.Add(New Binding("Text", dvMembres, "LibTelephone1"))
            txtTelephone1.DataBindings.Add(New Binding("Text", dvMembres, "Telephone1"))
            txtPosteTel1.DataBindings.Add(New Binding("Text", dvMembres, "PosteTel1"))
            txtLibTelephone2.DataBindings.Add(New Binding("Text", dvMembres, "LibTelephone2"))
            txtTelephone2.DataBindings.Add(New Binding("Text", dvMembres, "Telephone2"))
            txtPosteTel2.DataBindings.Add(New Binding("Text", dvMembres, "PosteTel2"))
            txtLibTelephone3.DataBindings.Add(New Binding("Text", dvMembres, "LibTelephone3"))
            txtTelephone3.DataBindings.Add(New Binding("Text", dvMembres, "Telephone3"))
            txtPosteTel3.DataBindings.Add(New Binding("Text", dvMembres, "PosteTel3"))
            txtLibTelephone4.DataBindings.Add(New Binding("Text", dvMembres, "LibTelephone4"))
            txtTelephone4.DataBindings.Add(New Binding("Text", dvMembres, "Telephone4"))
            txtPosteTel4.DataBindings.Add(New Binding("Text", dvMembres, "PosteTel4"))
            txtLibTelephone5.DataBindings.Add(New Binding("Text", dvMembres, "LibTelephone5"))
            txtTelephone5.DataBindings.Add(New Binding("Text", dvMembres, "Telephone5"))
            txtPosteTel5.DataBindings.Add(New Binding("Text", dvMembres, "PosteTel5"))
            txtCourriel.DataBindings.Add(New Binding("Text", dvMembres, "AdresseCourriel"))
            txtWeb.DataBindings.Add(New Binding("Text", dvMembres, "AdresseWeb"))
            txtFinMandat.DataBindings.Add(New Binding("Text", dvMembres, "FinMandat"))
            txtNote.DataBindings.Add(New Binding("Text", dvMembres, "Note"))
            txtCodeFonction.DataBindings.Add(New Binding("Text", dvMembres, "CodeFonction"))  ' Contrôle invisible
            ckbExecutif.DataBindings.Add(New Binding("Text", dvMembres, "Executif"))          ' Contrôle invisible
            txtClasserSous.DataBindings.Add(New Binding("Text", dvMembres, "ClasserSous"))    ' Contrôle invisible

        End Sub

        Private Sub DeleteRecord()

        End Sub

        Private Function GetData() As Boolean

            Dim strDatabase As String = DataPath & "\ConseilAdministration.mdb"
            Dim strConnection As String = "Provider=Microsoft.jet.oledb.4.0;data source=" & strDatabase
            Dim strSelect As String = "SELECT * FROM Membres ORDER BY ClasserSous"
            Dim blnGetData As Boolean = False

            Try
                Using conConseil As New OleDbConnection(strConnection)
                    daMembres = New OleDbDataAdapter(strSelect, conConseil)
                    dsMembres = New DataSet
                    daMembres.Fill(dsMembres, "Membres")
                    dvMembres = dsMembres.Tables("Membres").DefaultView
                End Using
                blnGetData = True
            Catch ex As Exception
                MessageBox.Show("Un problème empêche l'ouverture de la base de données." & vbCrLf & ex.Message, _
                                                "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error)
                blnGetData = False
            End Try

            Return blnGetData

        End Function

        Private Sub UpdateRecord()

            Dim strDatabase As String = DataPath & "\ConseilAdministration.mdb"
            Dim strConnection As String = "Provider=Microsoft.jet.oledb.4.0;data source=" & strDatabase
            Dim intRow As Int32 = lstMembres.SelectedIndex
            Dim intID As Int32 = dsMembres.Tables("Membres").Rows(intRow).Item("ID")
            Dim strUpdate As String = "UPDATE Membres SET Titre=cboTitre.Text, Prenom=txtPrenom.Text, " & _
                                      "Nom=txtNom.Text, Occupation=txtOccupation.Text, Adresse1=txtAdresse1.Text, " & _
                                      "Localite=txtLocalite.Text, CodePostal=txtCodePostal.Text, " & _
                                      "LibTelephone1=txtLibTelephone1.Text, Telephone1=txtTelephone1.Text, " & _
                                      "PosteTel1=txtPosteTel1.Text, " & _
                                      "LibTelephone2=txtLibTelephone2.Text, Telephone2=txtTelephone2.Text, " & _
                                      "PosteTel2=txtPosteTel2.Text, " & _
                                      "LibTelephone3=txtLibTelephone3.Text, Telephone3=txtTelephone3.Text, " & _
                                      "PosteTel3=txtPosteTel3.Text, " & _
                                      "LibTelephone4=txtLibTelephone4.Text, Telephone4=txtTelephone4.Text, " & _
                                      "PosteTel4=txtPosteTel4.Text, " & _
                                      "LibTelephone5=txtLibTelephone5.Text, Telephone5=txtTelephone5.Text, " & _
                                      "PosteTel5=txtPosteTel5.Text, " & _
                                      "Courriel=txtCourriel.Text, SiteWeb=txtWeb.Text, " & _
                                      "Fonction=cboFonction.Text, CodeFonction=Convert.ToInt32(txtCodeFonction.Text), " & _
                                      "FinMandat=Convert.ToInt32(txtFinMandat.Text), Note=txtNote.Text " & _
                                      "ClasserSous=txtClasserSous.Text, Executif=ckbExecutif.Value " & _
                                      "WHERE ID=intId"

            Try
                Using conConseil As New OleDbConnection(strConnection)
                    daMembres.UpdateCommand = New OleDbCommand(strUpdate, conConseil)
                    daMembres.Update(dsMembres, "Membres")
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Erreur")
            End Try

        End Sub

    End Class


    mercredi 30 avril 2014 19:38

Réponses

Toutes les réponses

  • bonjour,

    regarder ce lien qui pourras vous aidez : http://www.technologyuk.net/computing/vbnet/database_coding.shtml

    jeudi 1 mai 2014 08:15
  • Bonjour

    Si n'est pas trop tard, je dirais que le problème vient 
    ............. "WHERE ID=intId"
    intId = le plus probable doit être un entier.  Je vous propose de faire un DataBinding avec un TextBox  invisible et l'utiliser dans la requête!

    Bien cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.


    lundi 5 mai 2014 05:51
  • Bonjour Zorro591,

    Merci pour l'information.

    J'ai pu faire fonctionner les commandes UPDATE ET DELETE. Je bloque sur ADD. Je vais chercher par moi-même et je reviendrai si nécessaire.

    lundi 5 mai 2014 14:40
  • Bonjour Aurel,

    Merci pour l'information.

    Pour l'instant, j'ai abandonné l'utilisation de DataBinding et j'ai opté pour la stratégie de Zorro591.

    Je garde votre suggestion en réserve au cas ou j'utiliserais DataBinding plus tard.

    Je pense que mon problème venait, et vient toujours, du champ Note. C'est un champ de type Memo. Même dans la nouvelle stratégie proposée par Zorro591 je n'arrive pas à enregistrer les données avec ce champ. Je l'ai désactivé temporairement.

    Comment fait-on pour enregistrer un champ de type Memo?

    lundi 5 mai 2014 14:42
  • bonjour,

    pouvez-vous nous donner un aperçu votre code enregistrer?

    lundi 5 mai 2014 17:17
  • Bonjour,

    Me revoici après plusieurs jours de non disponibilité.

    La sauvegarde des modifications d'un enregistrement fonctionne. Le problème est pour l'ajout d'un nouvel enregistrement.

    À l'exécution, j'obtiens le message "Erreur de syntaxe dans l'instruction INSERT INTO."

    La table contient un champ ID de type AutoIncrement. Le problème vient peut-être de là. D'après ce que j'ai lu, OleDbCommandBuilder se sert de la commande SELECT ayant servi à créer le dataset pour bâtir la commande INSERT INTO. Si c'est le cas, on se retrouve avec quelque chose du genre ID = "" ou Nothing ou Null dans la ligne ajoutée, ce qui pose problème.

    Voici mon code. J'ai désactivé le champ Note de type Mémo parce qu'il pose problème même avec UPDATE. Je lancerai une autre question pour ce problème.

    Private Function RecordAdd() As Boolean
       Try
           Dim cb As New OleDb.OleDbCommandBuilder(m_da)
           Dim dsNewRow As DataRow
           dsNewRow = m_ds.Tables("Records").NewRow()
           With dsNewRow
               .Item("ClasserSous") = txtClasserSous.Text.ToString
               .Item("Titre") = cboTitre.Text.ToString
               .Item("Prenom") = txtPrenom.Text.ToString
               .Item("Nom") = txtNom.Text.ToString
               .Item("Occupation") = txtOccupation.Text.ToString
               .Item("Adresse1") = txtAdresse1.Text.ToString
               .Item("Localite") = txtLocalite.Text.ToString
               .Item("CodePostal") = txtCodePostal.Text.ToString
               .Item("LibTelephone1") = txtLibTelephone1.Text.ToString
               .Item("Telephone1") = txtTelephone1.Text.ToString
               .Item("PosteTel1") = txtPosteTel1.Text.ToString
               .Item("LibTelephone2") = txtLibTelephone2.Text.ToString
               .Item("Telephone2") = txtTelephone2.Text.ToString
               .Item("PosteTel2") = txtPosteTel2.Text.ToString
               .Item("LibTelephone3") = txtLibTelephone3.Text.ToString
               .Item("Telephone3") = txtTelephone3.Text.ToString
               .Item("PosteTel3") = txtPosteTel3.Text.ToString
               .Item("LibTelephone4") = txtLibTelephone4.Text.ToString
               .Item("Telephone4") = txtTelephone4.Text.ToString
               .Item("PosteTel4") = txtPosteTel4.Text.ToString
               .Item("LibTelephone5") = txtLibTelephone5.Text.ToString
               .Item("Telephone5") = txtTelephone5.Text.ToString
               .Item("PosteTel5") = txtPosteTel5.Text.ToString
               .Item("AdresseCourriel") = txtAdresseCourriel.Text.ToString
               .Item("AdresseWeb") = txtAdresseWeb.Text.ToString
               .Item("Fonction") = cboFonction.Text.ToString
               .Item("CodeFonction") = txtCodeFonction.Text.ToString
               .Item("Executif") = ckbExecutif.Checked
               .Item("FinMandat") = txtFinMandat.Text.ToString
               '.Item("Note") = rtbNote.Rtf
           End With
           m_ds.Tables("Records").Rows.Add(dsNewRow)
           m_da.Update(m_ds, "Records")
           Return True
       Catch ex As Exception
           MessageBox.Show("Un problème empêche la sauvegarde du nouvel enregistrement." & vbCrLf & ex.Message, _
                           "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error)
           Return False
       End Try
    End Function

    Merci!

    mercredi 21 mai 2014 19:40