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

VB.NET Discussion :

Access bindingData n'enregistre pas


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Par défaut Access bindingData n'enregistre pas
    Bonjour à tous,

    J'ai développer une application avec VB.NET, gestion des membres et des contacts d'une association, en utilisant Bindingsource sur Access. Lorsque j'enregistre sur Save du BindingNavigator, l'insertion n'est pas retenue. J'ai remarqué que la ligne ajoutée se trouve dans la table temporairement, mais, lorsque je ferme la Table ou l'application en exécution, cette ligne ajoutée disparait.
    Description du Formulaire:
    • Forms avec plusieurs TextBox en BindingSource et un DataGridView en BindingSource aussi.
    • Table=TMembre.accdb, access 2016
    • DataBindingSource = Bs
    • TableAdapter=Da
    • Ds=DataSet
    • DataGridView =dgvF



    Le code est le suivant:

    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
    23
    24
    25
    26
    27
    28
     
    Public i as Integer
     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
     
            Me.Da.Fill(Me.Ds.TMembre)
            etiNbEnregistrement.Text = "Il y a " & Ds.Tables(0).Rows.Count.ToString & " Membres enregistrés"
            i = Ds.Tables(0).Rows.Count
        End Sub
    'Add button
    Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click
            'dgvF proprièté AllowUserToAddRows est déjà en True
            txtNoms.Select()
            Bs.AddNew()
            txtNumero.Text = i + 1
     
    End Sub
    'Save Button
    Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
            Try
                Bs.EndEdit()
                Ds.AcceptChanges()
                Da.Update(Ds.TMembre)
                MessageBox.Show("LIGNE ENREGISTRÉE", "message", MessageBoxButtons.OK, MessageBoxIcon.Information)
                dgvF.RefreshEdit()
            Catch ex As Exception
                MessageBox.Show("CONTACT NON ENREGISTRÉ", "message", MessageBoxButtons.OK, MessageBoxIcon.Information)
    End Try
    End Sub
    Je ne sais pas pourquoi ces instructions sur BtnSAve_Click ne fonctionne pas or j'ai fait plus de recherche sur youtube et google mais ce sont les instructions de SAVE de DataBinding avec vb.net et que sur ces sites ces instructions fonctionnent à merveille.
    Je vous remercie de vos précieuses aides.

  2. #2
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour,

    Voici un projet de test du CommandBuilder : TestAccesDBCommandBuilder.zip.
    Excuse-moi pour les commentaires en espagnol. Ils sont faciles à comprendre mais si tu as une difficulté tu peux traduire avec Google Translator (ou me demander).
    En l'expérimentant et en comparant avec ton code, tu trouveras peut-être la solution.

    Pour exécuter, il te faut changer le chemin de la DB et sélectionner la bonne chaîne de connexion : Jet 4.0 ou ACE 12.0.

    Nom : TestCommanBuilder.jpg
Affichages : 139
Taille : 80,7 Ko


  3. #3
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour
    Il y a 2 feuilles de route à suivre
    1/ utiliser correctement le Designer
    2/ tout coder comme dit par Phil.


    La route du designer VS est la plus simple
    a) menu Données -> ajouter nouvelle source de données
    tu executes toutes les etapes du wizard .A la question copier la bd vers le dossier du projet,repond "NON". => ceci a pour effet à utiliser ta bd à sa place d'origine et non une copie dans le dossier ...user\dossiertonprojet\debug
    b) menu Données -> afficher la source de données
    tu y trouveras ta table avec ses champs .
    - sélectionne la table ,il y a une flèche -> sélectionne un datagridview
    - resélectionne la table et droppe là sur le form :bonus tu as un dgv tout pret
    - idem tu droppes chaque champ : bonus tu as un textbox tout prêt.
    En bonus tu observeras sur le panneau des composants en bas du form : un dataset,un bindingsource,un table adapter,un bindingnavigator

    dans le code du form tu auras ceci :
    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
    23
    24
    25
    26
    27
    28
    29
     
    Public Class Form2
     
      Public Class Form1
     
     
     
     
     
     
     
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            'TODO: cette ligne de code charge les données dans la table 'DS.TMember'. Vous pouvez la déplacer ou la supprimer selon vos besoins.
            Me.TMemberTableAdapter.Fill(Me.DS.TMember)
     
        End Sub
        Private i As Integer = 0
        Private Sub BindingNavigatorAddNewItem_Click(sender As System.Object, e As System.EventArgs) Handles BindingNavigatorAddNewItem.Click
            ' code à taper
            Me.NOMTextBox.Select()
            Me.NUMEROTextBox.Text += i
        End Sub
        Private Sub TMemberBindingNavigatorSaveItem_Click(sender As System.Object, e As System.EventArgs) Handles TMemberBindingNavigatorSaveItem.Click
            Me.Validate()
            Me.TMemberBindingSource.EndEdit()
            Me.TableAdapterManager.UpdateAll(Me.DS)
     
        End Sub
    End Class
    La route du CODE c'est "the hard way" .
    NB: la table doit avoir une clé primaire pour utiliser le class OleDbCommandBuilder
    il faut taper simplement le code suivant (methode suggerée par Phil):[/B]
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    Imports System.Data.OleDb
     
    Public Class Form1
        Private con As OleDbConnection = Nothing
        Private stringCon As String = Nothing
        Private DA As OleDbDataAdapter
        Private BUILDER As OleDbCommandBuilder
        Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
            Dim table As New DataTable("TMember")
            DS.Tables.Add(table)
            stringCon = GetConnectionString()
     
            con = New OleDbConnection(stringCon)
            con.Open()
            Dim stringSQL As String = "SELECT * FROM Test"
            Dim cmd As New OleDbCommand(stringSQL, con)
            DA = New OleDbDataAdapter(cmd)
            BUILDER = New OleDbCommandBuilder(DA)
            BUILDER.GetUpdateCommand()
            BUILDER.GetInsertCommand()
            BUILDER.GetDeleteCommand()
     
            DA.Fill(DS, table.TableName)
            BDS.DataSource = DS
            BDS.DataMember = table.TableName
            dgvF.DataSource = BDS
            PrepareBoxes()
        End Sub
        Private Sub PrepareBoxes()
            Me.NumeroText.DataBindings.Add("Text", BDS, "NUMERO", True, DataSourceUpdateMode.OnPropertyChanged)
            Me.NomText.DataBindings.Add("Text", BDS, "NOM", True, DataSourceUpdateMode.OnPropertyChanged)
            Me.PrenomText.DataBindings.Add("Text", BDS, "PRENOM", True, DataSourceUpdateMode.OnPropertyChanged)
            Me.AgeText.DataBindings.Add("Text", BDS, "AGE", True, DataSourceUpdateMode.OnPropertyChanged)
     
     
        End Sub
        Private i As Integer = 0
        Private Sub btnAdd_Click(sender As System.Object, e As System.EventArgs)
            Me.NumeroText.Select()
            Me.NumeroText.Text += i
        End Sub
     
        Private Sub btnSave_Click(sender As System.Object, e As System.EventArgs) Handles btnSave.Click
            DA.Update(DS, "TMember")
        End Sub
     
     
        Private Function GetConnectionString() As String
     
            Return "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\randritsy\Desktop\bdtest.accdb"
        End Function
     
     
     
    End Class
    bon code ....

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Par défaut
    Citation Envoyé par Phil Rob Voir le message
    L'autre code en bas j'ai déjà essayé mais j'aimerai tenté le DataBinding méthode, je vais essayer ce que vous m'avez suggéré merci de votre aide.

    Citation Envoyé par MABROUKI Voir le message
    J'ai suivi à la lettre celle de vous et de Phil mais pas encore résolu: ajout d'enregistrement non encore retenu, disparait après que je ferme l'application forms.
    j'ai supprimé le fichier access du dossier /bin/debug et l'a mis dans un autre endroit, j'ai changer la connectionString en Settings et changer le config App, mais dès que je compile le fichier le fichier base de données sera encore copié dans le bin/debug

  5. #5
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour,
    SI la DB est recopiée dans Debug, c'est qu'elle a été implémentée dans le projet à l'aide de l'assistant "source de données".
    Je n'utilise jamais cet outil et de ce fait, je le connais peu.
    Mais il y a une propriété de l'objet DataSet intégré au projet qui précise s'il faut copier la DB ou non.
    J'espère que cette piste t'aidera...

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Par défaut
    j'ai déjà changé la propriété Copy to output directory en Never, mais, l'ajout d'enregistrement ne marche pas

  7. #7
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour,
    Comme je le disais dans mon message précédent, je connais peu cette façon de procéder.
    Mais si tu veux envoyer ton projet, complet avec la DB, j'y regarderai, sans garantie de résultats ...

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Par défaut
    Ci-joint le fichier merci de votre aide Phil
    Fichiers attachés Fichiers attachés

  9. #9
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour Randritsy,

    Voici un extrait du code que tu m'as envoyé, avec 2 lignes permutées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
       Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
            Try
                Validate()
                Bs.EndEdit()
     
                dapt.Update(Ds, "FaakMembre")   ' !!!!!!!!  A FAIRE D'ABORD !!!!!!
     
                Ds.AcceptChanges()   ' !!!!!!!!  A FAIRE ENSUITE !!!!!!
     
                MessageBox.Show("LIGNE ENREGISTRÉE", "FAAK MAINTIMOLALY", MessageBoxButtons.OK, MessageBoxIcon.Information)
     
    ' ... ... ...
    J'explique : AcceptChanges réinitialise à FALSE tous les "témoins" de changement dans le DataSet. Or, les commandes d'enregistrements (sur Ajout, sur Modification et sur Suppression) agissent sur les enregistrements du DataSet qui ont le témoins correspondant à TRUE.
    Dans l'ordre de ton code tel que je l'ai reçu, l'UpDate est exécuté après le AcceptChanges et ne trouve aucun enregistrement avec le témoin de modification à TRUE. Elle n'a donc rien à faire et donc, rien n'est effectivement enregistré.

    Les témoins de changements sont Added, Modified et Deleted. On peut les lire avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Ds.Tables(0).GetChanges(DataRowState.Modified)  ' 0 pour la 1ère table du Ds, mais on peut aussi indiquer le nom de la table.
    Il est possible d'isoler dans un DataTable les lignes concernées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Dim MesModif As DataTable = Ds.Tables(0).GetChanges(DataRowState.Modified)  ' 0 pour la 1ère table du Ds, mais on peut aussi indiquer le nom de la table.
     
    'ou
     
    Dim MesModif As DataTable = Ds.Tables(0).GetChanges(DataRowState.Added)  ' 0 pour la 1ère table du Ds, mais on peut aussi indiquer le nom de la table.
     
    'ou
     
    Dim MesModif As DataTable = Ds.Tables(0).GetChanges(DataRowState.Deleted)  ' 0 pour la 1ère table du Ds, mais on peut aussi indiquer le nom de la table.

    J'espère que tout ceci t'aidera.

    Bonne soirée ...

Discussions similaires

  1. Réponses: 0
    Dernier message: 27/08/2015, 00h04
  2. Access n'enregistre pas
    Par aiderecquise dans le forum Access
    Réponses: 3
    Dernier message: 30/06/2010, 10h51
  3. Réponses: 12
    Dernier message: 02/09/2005, 17h44
  4. db enregistre pas toujour
    Par cre3000 dans le forum Bases de données
    Réponses: 1
    Dernier message: 23/05/2005, 12h16
  5. SQL et Access : ajouter plusieurs enregistrements
    Par Bernard M dans le forum Bases de données
    Réponses: 3
    Dernier message: 23/04/2004, 21h39

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