none
Enregistrement d'un DataTable dans Access (VB Express 2015) RRS feed

  • Question

  • Bonjour à tous,

    D'habitude, je trouve toujours ma solution sur internet, mais là ... impossible

    Voici mon problème :
    A l'ouverture de ma Form, je charge 4 tables Access dans mon DataSet :

    Public Class Frm_Salarié_EtatCivil
        Private MaConnexionSalariés As New OleDbConnection
        Private MaCommandBuilderSalariés As New OleDbCommandBuilder
        Private MonDataAptaterSalariés As New OleDbDataAdapter
        Private MonDataSetSalariés As New DataSet


        Private Sub Frm_Salarié_EtatCivil_Load(sender As Object, e As EventArgs) Handles MyBase.Load

            'Alimente le nouveau DataSet avec les tables Tbl_Salariés, Tbl_Salariés_TitreSéjour, Ref_TitreSéjour et Tbl_Salariés_Agréments
            MaConnexionSalariés = New OleDbConnection(MaConnexionString)
            MaConnexionSalariés.Open()

            MaCommandBuilderSalariés = New OleDbCommandBuilder(MonDataAptaterSalariés)
            MonDataAptaterSalariés = New OleDbDataAdapter("SELECT * FROM Tbl_Salariés WHERE Id_Salarié=4", MaConnexionSalariés)
            MonDataAptaterSalariés.Fill(MonDataSetSalariés, "Tbl_Salariés")
            MaCommandBuilderSalariés.RefreshSchema()

            MonDataAptaterSalariés.SelectCommand.CommandText = ("SELECT * FROM Tbl_Salariés_TitreSéjour WHERE Id_Salarié=4")
            MonDataAptaterSalariés.Fill(MonDataSetSalariés, "Tbl_Salariés_TitreSéjour")
            MaCommandBuilderSalariés.RefreshSchema()
            MonDataAptaterSalariés.SelectCommand.CommandText = ("SELECT * FROM Ref_TitreSéjour")
            MonDataAptaterSalariés.Fill(MonDataSetSalariés, "Ref_TitreSéjour")
            MaCommandBuilderSalariés.RefreshSchema()

            MonDataAptaterSalariés.SelectCommand.CommandText = ("SELECT * FROM Tbl_Salariés_Agréments WHERE Id_Salarié=4")
            MonDataAptaterSalariés.Fill(MonDataSetSalariés, "Tbl_Salariés_Agréments")
            MaCommandBuilderSalariés.RefreshSchema()

        End Sub

    En cliquant sur un bouton (Btn_AjoutTitre), je veux qu'il m'ajoute une ligne dans la table Tbl_Salariés_TitreSéjour :

        Private Sub Btn_AjoutTitre_Click(sender As Object, e As EventArgs) Handles Btn_AjoutTitre.Click

                Dim dr As DataRow = MonDataSetSalariés.Tables("Tbl_Salariés_TitreSéjour").NewRow
                dr("Id_TitreSéjour") = compteur + 1
                dr("Id_Salarié") = 4
                dr("TitreSéjour_Type") = Form_TitreSéjour.Controls("Fld_TitreSéjour_Type").Text
                dr("TitreSéjour_Numéro") = Form_TitreSéjour.Controls("Fld_TitreSéjour_Numéro").Text
                dr("TitreSéjour_DateDébut") = Form_TitreSéjour.Controls("Fld_TitreSéjour_DateDébut").Text
                dr("TitreSéjour_DateFin") = Form_TitreSéjour.Controls("Fld_TitreSéjour_DateFin").Text
                MonDataSetSalariés.Tables("Tbl_Salariés_TitreSéjour").Rows.Add(dr)

                'Modifier les valeurs changées dans le DataAdapter
                MaCommandBuilderSalariés = New OleDbCommandBuilder(MonDataAptaterSalariés)
                'Mise à jour
                MonDataAptaterSalariés.Update(MonDataSetSalariés, "Tbl_Salariés_TitreSéjour")
                MonDataAptaterSalariés.Fill(MonDataSetSalariés, "Tbl_Salariés_TitreSéjour")

        End Sub

    1ière question : Le click sur le bouton ajoute bien ma ligne dans ma Datatable mais pas dans Access
    2ième question : si j'ajoute la dernière ligne (MonDataAptaterSalariés.Update(MonDataSetSalariés, "Tbl_Salariés_TitreSéjour")), le debug bloque sur celle-ci en affichant le message "DataColumn 'Agrément_Numéro' manquant dans DataTable 'Tbl_Salariés_TitreSéjour' pour SourceColumn 'Agrément_Numéro'"
    Ce que je ne comprends pas c'est que 'Agrément_Numéro' ne fait pas partie de la Datatable "Tbl_Salariés_TitreSéjour" de mais de la Datatable "Tbl_Salariés_Agréments"

    Débutant, n'hésitez pas à me donner des suggestions pour améliorer mon code, je suis preneur....

    Merci à vous de bien vouloir m'aider


    jeudi 27 juillet 2017 08:26

Toutes les réponses

  • Bonjour Frank,
    Pour la sauvegarde des données dans la database, consultez: Enregistrement de données dans des groupes de données.
    Par rapport votre deuxième question, je vous propose d'utiliser des DataAdapter séparés pour chaque table pour éviter cette erreur.
    Merci de nous tenir au courant.

    Cordialement, 
    Nina


    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    vendredi 28 juillet 2017 07:48
    Modérateur
  • Merci Nina pour ta réponse.

    En fait j'ai 5 tables a intégrer, donc je suppose 5 DataAdapter à créer ... heureusement que je n'en n'ai pas 50 !!!

    Et donc je suppose que j'ai 5 CommandBuilder à créer également ?

    Il n'y a pas une méthode plus simple pour modifier mes DataTables et mettre à jour ma BDD ?

    Comment font les informaticiens pro quand ils ont une centaine de tables à manipuler ?

    Frank

    vendredi 28 juillet 2017 13:33