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 :

Partager une base de données - Fractionnement [Débutant]


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut Partager une base de données - Fractionnement
    Bonjour à tous,

    J'ai développé une application vbNet (Framework 2) lié à des bases de données access. Les bases de données sont stockés pour l'instant sur un disque commun en réseau. A terme, plusieurs utilisateurs utiliseront les mêmes bases de données.
    Pour se connecter aux bases de données j'ai crée un module comportant tous les chemins d'accès du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Sub connection1()
            base1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = "
            base3 = "U:\commun\BDD\escale.mdb;"
        End Sub
    Dans mon form1 principal j'ai ce sub :
    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 Sub GetData(ByVal selectCommand As String)
     
            Try
                ' Specify a connection string. Replace the given value with a 
                ' valid connection string for a Northwind SQL Server sample
                ' database accessible to your system.
                Call connection1()
                Dim connectionString1 As String = base1 & base3
     
                ' Create a new data adapter based on the specified query.
                Me.Table1dataAdapter = New OleDbDataAdapter(selectCommand, connectionString1)
     
                ' Create a command builder to generate SQL update, insert, and
                ' delete commands based on selectCommand. These are used to
                ' update the database.
                Dim commandBuilder1 As New OleDbCommandBuilder(Me.Table1dataAdapter)
     
                ' Populate a new data table and bind it to the BindingSource.
                Dim table1 As New DataTable
                table1.Locale = System.Globalization.CultureInfo.InvariantCulture
     
                Me.Table1dataAdapter.Fill(table1)
                Me.Table1bindingSource.DataSource = table1
     
            Catch ex As DataException
                MsgBox(Err.Description)
                System.Diagnostics.Debug.WriteLine("erreur")
            End Try
    Dans le load de mon form1 j'ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GetData("select * from Table1")
    Dans mon projet, j'ai différents form ou les utilisateurs font des saisies :

    - Pour ajouter une nouvelle entrée, j'utilise la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1.Table1bindingSource.DataSource.Rows.Add(New Object(){......}
    puis je mets à jour avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Form1.Table1bindingSource.Position = Form1.Table1bindingSource.Count - 1
                   Form1.Table1dataAdapter.Update(CType(Form1.Table1bindingSource.DataSource, DataTable))
                   Form1.GetData(Form1.Table1dataAdapter.SelectCommand.CommandText)
    - Pour mettre à jour, je mets à jour le Table1datagridview puis je mets à jour
    Me.Validate()
    Form1.Table1bindingSource.EndEdit()
    Form1.Table1dataAdapter.Update(CType(Form1.Table1bindingSource.DataSource, DataTable))
    Tout cela pour arriver à ma question, pour des raisons d'optimisation et de rapidité, j'ai lu qu'on peut fractionner les bases de données en lisant ceci :
    http://office.microsoft.com/fr-fr/ac...010240096.aspx

    Le soucis est que je suppose que je doive revoir mon code pour mon application.... et là je ne sais pas quoi modifier ....
    Ensuite pour distribuer la base frontale à + d'un utilisateur ?
    Et un autre point important est que les utilisateurs n'ont pas access d'installé.
    Puis-je fractionner sur un PC non relié au réseau mais équipé d'Access pour la fractionner et ensuite distribuer la base frontale ?

    Je suis vraiment perdu sur ce coup ..... Merci d'avance

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    si le but est d'avoir plus de performances et plus de fiabilité, autant utiliser une vraie bases de données type sql server ^^
    (la version express est gratuite)
    vu que tu as déjà encapsulé l'accès aux données ca ne serait pas compliqué à adapter à sql server

    après le lien que tu nous donnes est pour access 2007/2010 qui fait des fichiers .accdb, or ton code montre un .mdb donc access 97/2003
    cette fonction n'existait peut etre pas, bien qu'elle ressemble à la fonctionnalité de réplication

    sinon pour optimiser l'ajout d'indexes peut parfois suffire
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Bonjour Pol63,

    Merci pour tes précisions. En fait je rois deviner d'où vient mes lenteurs dans le traitement des données mais cela fait des heures que je cherche et que je ne sais pas comment faire .... J'espère que tu pourras me donner un coup de main

    Dans mon poste précédent, j'ai mis le principe pour lier ma base de données à un datagridview.
    Dans mon projet, j'ai 4 datagridviews reliés à la même base de données.
    Chaque datagridview se trouve dans un onglet d'un tabcontrol.

    Je pars sur le principe de deux Datagridview
    Pour chaque datagridview, je filtre les données. Pour Le Table1datagridview ce serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Table1bindingSource.Filter = "Site='" & sitechoisi & "' and Type='Mission' and Missionterminee='NON'"
    Me.Table1DataGridView.DataSource = Table1bindingSource
    Pour le deuxième Table2datagridview :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Table2bindingSource.Filter = "Site='" & sitechoisi & "' and Type='Mission' and Missionterminee='OUI'"
    Me.Table2DataGridView.DataSource = Table2bindingSource
    etc

    L'utilisateur peut faire des modifs dans chaque Datagridview. Et celà corrigera l'affichage des deux Datagridviews en fonction des filtres adaptés ci-dessus.
    Actuellement, je crée à chaque fois une nouvelle connection pour chaque datagridview.
    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
    Public Sub GetData(ByVal selectCommand As String)
     
            Try
     
                Call connection1()
                Dim connectionString1 As String = base1 & base3
     
                Me.Table1dataAdapter = New OleDbDataAdapter(selectCommand, connectionString1)
                Me.Table2dataAdapter = New OleDbDataAdapter(selectCommand, connectionString1)
     
                Dim commandBuilder1 As New OleDbCommandBuilder(Me.Table1dataAdapter)
                Dim commandBuilder2 As New OleDbCommandBuilder(Me.Table2dataAdapter)
     
                Dim table1 As New DataTable
                table1.Locale = System.Globalization.CultureInfo.InvariantCulture
                Dim table2 As New DataTable
                table2.Locale = System.Globalization.CultureInfo.InvariantCulture
     
                Me.Table1dataAdapter.Fill(table1)
                Me.Table1bindingSource.DataSource = table1
                Me.Table2dataAdapter.Fill(table2)
                Me.Table2bindingSource.DataSource = table2
     
            Catch ex As DataException
                MsgBox(Err.Description)
                System.Diagnostics.Debug.WriteLine("erreur")
            End Try
    Lorsque je fais une insertion ou modif du Table1datagridview(de la manière que j'ai mis dans mon premier post), Mon Table2datagridview doit aussi se mettre à jour en fonction des données par rapport à mes filtres et vice-versa.
    Pour l'instant le seul moyen que j'ai trouvé est de rajouter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1.GetData(Form1.Table2dataAdapter.SelectCommand.CommandText)
    Celà fait recharger tous les données et je perds énormément de temps. Imagine j'ai 4 datagridviews reliés à la même base de données. C'est une catastrophe !!
    Par rapport à mon code ci-dessus, je ne sais vraiment pas comment faire. J'espère vraiment que tu pourras m'aider

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    le mieux serait de rouvrir un topic avec un titre adapté à cette nouvelle question où tu expliquerais ce que tu fais

    et je n'y connais rien en dataset, dataadapter et bindingsource, vu que ce sont des objets déjà légèrement lent à la base (même si la lenteur vient ici de la manière dont tu les utilises, par exemple faire un filtre sur les données reçues plutôt que dans la requête, ou encore recharger tout en cas de modification locale)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Si les DataGridView représentent des vues de la même table, on les bindera à la même DataTable et , en principe, les modifications de la DataTable effectuées sur une des DataGridView se répercuteront automatiquement sur les autres DataGridView.

    je n'y connais rien en dataset, dataadapter et bindingsource, vu que ce sont des objets déjà légèrement lent à la base...
    Charger et afficher des tables de moins de 100 000 enregistrements ne pose pas de problèmes particuliers en terme de performance.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Salut Graffito,

    Merci pour ta réponse . Malheureusement j'ai essayé de modifier le sub getdata sans succès .
    Peux tu me guider ?
    Merci d'avance pour ton aide

  7. #7
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Hello,

    Il y a beaucoup de chemin différent pour arriver à ce que tu veux faire. Chaqu'une de ces solutions a des avantages et des inconvénients en fonction de la situation. Je ne garantis donc pas que ce que je propose soit la plus optimum.

    La marche donnée s'effectue uniquement à l'aide du designer. Il n'y a pas une ligne de code a écrire !!! Elle suppose que tu as correctement renseigner ta source de donnée dans ton projet.

    Tu mets un dataset commun sur le formulaire, avec les tables adapters nécessaires pour charger tes données.
    Tu mets ensuite 4 bindingsource et 4 datagridview (dans des onglets différents si ça te fait plaisir, même si pour la démo ça ne change rien).
    Tu mets la datasource des 4 bindingsource sur la datatable de ton dataset (dataset en tant que datasource, datatable en tant que datamember). Pour chaque grille tu met la datasource sur une bindingsource. Tu changes la propriété filter des bindings source selon tes besoins.

    Tu lances l'application, regardes les grilles, modifies quelques données. Normalement ça doit se répliquer. Ca c'est la démo pour le principe. Pas une ligne de code écrite, 5 minutes top chrono pour la réalisation.

    Ensuite on peut discuter de la gestion de la sélection du site avec une relation entre 2 tables dans le dataset plutôt que du charger le filtre dans les bindingsources.

    Vouloir écrire les choses à la main pour comprendre un peu mieux ce que fait le designer c'est bien. Mais il faut mieux maîtriser et comprendre ce dernier avant !

  8. #8
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Sub GetData(ByVal selectCommand As String)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
         Try
             Call connection1()
             Dim connectionString1 As String = base1 & base3
             Me.Table1dataAdapter = New OleDbDataAdapter(selectCommand, connectionString1)
             Dim commandBuilder1 As New OleDbCommandBuilder(Me.Table1dataAdapter)
             Dim table1 As New DataTable
             table1.Locale = System.Globalization.CultureInfo.InvariantCulture
             Me.Table1dataAdapter.Fill(table1)
             Me.Table1bindingSource.DataSource = table1
             Me.Table2bindingSource.DataSource = table1
          Catch ex As DataException
             MsgBox(Err.Description)
             System.Diagnostics.Debug.WriteLine("erreur")        End Try
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Bonsoir Graffito,

    Au début j'avais utilisé le designer pour lier mais Visual studio est installé sur un portable non connecté au disque réseau ou sont stockés mes bases de données.

    Donc j'avais essayé par la suite de modifier manuellement les chemins d'accès mais çà ne marchait plus ensuite.

    Puis sur MSDN, j'avais trouvé cette méthode et développé toute mon application sur ce principe, donc sans utiliser le designer. Mais impossible de trouver un exemple qui corresponde à mon cas.

    J'ai corrigé comme tu le suggères. Et rien ne s'affiche dans Table1Datagridview + Table2Datagridview. Si j'enlève cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Table2bindingSource.DataSource = table1
    Et la mon Table1datagridview se remplit mais bien sur mon Table2datagridview est vide...
    C'est comme si je ne pouvais pas affecter une même table à deux Bindingsource différents.

    Merci pour ta future aide

  10. #10
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Re,

    Bon je continue à chercher et suis tombé sur le principe du dataview... j'ai modifié le code ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Try
             Call connection1()
             Dim connectionString1 As String = base1 & base3
             Me.Table1dataAdapter = New OleDbDataAdapter(selectCommand, connectionString1)
             Dim commandBuilder1 As New OleDbCommandBuilder(Me.Table1dataAdapter)
             Dim table1 As New DataTable
             table1.Locale = System.Globalization.CultureInfo.InvariantCulture
             Me.Table1dataAdapter.Fill(table1)
             Me.Table1bindingSource.DataSource = table1
             Me.Table2bindingSource.DataSource = New DataView(table1)
          Catch ex As DataException
             MsgBox(Err.Description)
             System.Diagnostics.Debug.WriteLine("erreur")        End Try
    Bon là les deux Tableaux s'affichent correctement mais j'ai été confronté à un autre problème.... Dans chaque Tabledatagridview je peux modifier des données depuis Table1datagridview ou Table2datagridview qui auront forcément des conséquences sur l'affichage sur l'autre tableau.
    Au début si je faisais une modif sur le deuxième tableau je faisais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Me.Validate()
    Me.Table2bindingSource.EndEdit()
    Me.Table2dataAdapter.Update(CType(Me.Table2bindingSource.DataSource, DataTable))
    Là un message d"erreur car ma datasource de mon 2ème tableau est un dataview.
    Donc j'ai modifié la dernière ligne ainsi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Me.Validate()
    Me.Table2bindingSource.EndEdit()
    Me.Table1dataAdapter.Update(CType(Me.Table1bindingSource.DataSource, DataTable))
    Si j'ai bien compris, si j'ai 4 tableaux et que pour les 3 autres, les datasources sont en dataview, si je fais une modif dans le tableau4, le EndEdit() se fait toujours sur le bindingsource ou j'ai modifié MAIS le Update sera toujours à faire sur le datatable ? ET normalement ma base de données se mettra toujours à jour même si je fais une modif sur un tableau autre que le Table1datagridview ? Et alors mon code sera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Me.Validate()
    Me.Table4bindingSource.EndEdit()
    Me.Table1dataAdapter.Update(CType(Me.Table1bindingSource.DataSource, DataTable))
    Est-ce exact ?

  11. #11
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    La remontée vers la base de donnée des modifications s'effectuent effectivement avec la fonction update du tableadapter.

    Les multiples dataview et bindingsource te permettent juste d'afficher (et de garder synchroniser) tes différentes datagridview.

    De même sur les autres instance de ton application (un autre utilisateur par exemple), les modifications ne seront visibles que s'ils rechargent les données avec l'instruction fill du tableadapter. (Réouverture du formulaire, relancement de l'application, bouton refresh, etc.)

  12. #12
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour le parrain (napolitain, calabrais ou sicilien ?),

    L'utilisation des DataView est une bonne solution qui évite probablement des conflits entre les propriétés "Filter" des différents BindingSource.

    Les conclusions que tu indiques à la fin de ton dernier post sont exactes, en particulier l'instruction Me.Table1dataAdapter.Update(...), mais n'oublie pas de la faire suivre par table1.AcceptChanges() de façon à ne pas répéter les modifications à la base de donnés lors du prochain appel au DataAdapter.Update().

    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  13. #13
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Graffito :

    Bonjour le parrain (napolitain, calabrais ou sicilien ?),
    Origine Sicilienne

    merci pour ces précisions. J'ai aussi du modifier le code pour insérer une nouvelle ligne de données . Même si je le fais via le 4ème Tableau, je dois faire l'ajout en code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Form1.Table1bindingSource.DataSource.Rows.Add(New Object() {....})
    Form1.Table1bindingSource.Position = Form1.Table1bindingSource.Count - 1
    Form1.Table1dataAdapter.Update(CType(Form1.Table1bindingSource.DataSource, DataTable))
    Et cela met à jour ma Base de donnée et mes tableaux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mais n'oublie pas de la faire suivre par table1.AcceptChanges() de façon à ne pas répéter les modifications à la base de donnés lors du prochain appel au DataAdapter.Update().
    Ah merci, car je pensais que le .Update mettait directement la base de données à jour et que cela suffisait. Je dois mettre le AcceptChanges() d'office ? en fait dès que j'appelle le .Update ?

    Le .AcceptChanges() je le fais sur quoi ? Table1dataAdapter, Datatable ,... le quel car là j'ai une masse d'infos qui m'arrivent et dur dur d'assimiler tout celà d'un cou^p

    Sinople : Merci pour tes précisions.

  14. #14
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Le .AcceptChanges() je le fais sur quoi ? Table1dataAdapter, Datatable ,... le quel car là j'ai une masse d'infos qui m'arrivent et dur dur d'assimiler tout celà d'un cou^p
    AcceptChanges est une methode de DataTable (ou de DataRow, plus rapide lorsqu'on a ajouté ou modifié une seule row).

    Le DataTable a une propriété RoState qui indique si il s'ajout d'ajout de suppression ou de modification. Voir http://msdn.microsoft.com/fr-fr/libr...=vs.80%29.aspx

    Noter que le DataTable garde la datarow initiale ET la datarow modifiée.

    La methode Accept Changes met toutes les RowState à l'état "Unchanged".
    Si on ne le fait pas, une row avec l'état "Added" sera ajoutée une 2ème fois si on fait un 2ème DataAdapter.Update.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  15. #15
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Aïe, Aïe...

    L'instruction .Update() du table adapter s'occupe d'appeller .AcceptChanges() dans sa routine. Donc mettre un .AcceptChanges() après un update ne sert à rien.

    Les appels manuel de .AcceptChanges() c'est à faire si tu désires implémenter ta propre interface vers la base de donnée !

  16. #16
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Bonjour à tous,

    Bon cela à l'air de bien tourner et j'ai gagné en rapidité. J'ai juste un dernier soucis.....

    Plusieurs utilisateurs de différents poste peuvent modifier les données. Donc j'ai rajouter un bouton "Rafraichir" afin que chaque utilisateur puisse recharger les données depuis la base de données afin d'avoir les tableaux à jour.
    Dans mon cas, j'avais donc lié 4 datagridviews à la même datatable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Me.Table1dataAdapter.Fill(table1)
                Me.Table1bindingSource.DataSource = table1
                Me.Table2bindingSource.DataSource = New DataView(table1)
                Me.Table3bindingSource.DataSource = New DataView(table1)
                Me.Table4bindingSource.DataSource = New DataView(table1)

    La fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub reloadButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
            Handles reloadButton.Click
     
            ' Reload the data from the database.
            GetData(Me.Table1dataAdapter.SelectCommand.CommandText)
        End Sub
    Le Hic est qu'alors dans mon datagridview, la même entrée apparait 4 fois. Je pense que je dois réinitialiser les données de mes datagridviews avant de relancer le chargement des données. Ou bien existe-t-il un moyen, une fonction qui permette que le datatable importe les différences entre la BDD et lui d'une manière + rapide ?

  17. #17
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    La technique la plus simple et de mettre la propriété ClearBeforeFill du tableadapter à True. Ainsi, il efface les données avant de les recharger.

    Il est bien entendu conseillée de faire un .Save avant sinon l'utilisateur perd ses modification en cours! Vu que les données sont effacés, l'utilisateur va aussi perdre la position sur la table.

    Il est aussi possible de charger les données mise à jour dans un dataset, table temporaire puis de fusionner ce dernier avec les données de travail. C'est la fonction Merge(). C'est un peu plus complexe mais si tu as une piste si tu veux te documenter :-)

  18. #18
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Salut sinople,

    La technique la plus simple et de mettre la propriété ClearBeforeFill du tableadapter à True. Ainsi, il efface les données avant de les recharger.
    Je suis partisan du + simple. Heu je le mets ou ce truc ? et faut ensuite que je le remette à false ?
    J'ai essayé dans le sub du bouton raffraichir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Table1dataAdapter.ClearBeforeFill ()
    J'ai une erreur me disant que ClearBeforeFill n'est pas un membre de system.data.Oleb.......

    Il est bien entendu conseillée de faire un .Save avant sinon l'utilisateur perd ses modification en cours! Vu que les données sont effacés, l'utilisateur va aussi perdre la position sur la table.
    Si j'ai bien compris le Update du dataadapter ...., cela injecte automatiquement les données dans la BDD. Dans mon application. Je crains avec le .Save que si un utilisateur 2 a fait une modif et que l'utilisateur 1 fait un .Save (à ce moment là sa datatable n'aura pas encore intégré la modif de l'utilisateur 2), cela risquerait d'effacer dans la BDD la modif de l'utilisateur 2

  19. #19
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Bon ben avec le .merge() c'est pareil. J'ai pourtant essayé de comprendre ici :

    http://msdn.microsoft.com/fr-fr/library/9dkss51z.aspx

    Surement que je m'y prends mal ou que je comprends rien......

  20. #20
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Hello

    Un peu de doc sur le table adapter.

    http://msdn.microsoft.com/fr-fr/libr...(v=vs.80).aspx

    C'est pas une fonction/procédure c'est une propriété boolean si jamais. Tu peux donc l'initialiser directement dans le designer.

    Il definit juste un comportement sur l'instruction fill indiquant s'il doit vider le contenant (la datatable) avant de la remplir.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Partager une base de données Access
    Par sylvain62 dans le forum Modélisation
    Réponses: 7
    Dernier message: 30/09/2008, 10h51
  2. [MySQL] Comment partager une base de données
    Par Moxostoma dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 22/08/2007, 00h31
  3. Sauvegarde d'une base de données fractionnée
    Par Alexandr dans le forum Access
    Réponses: 2
    Dernier message: 19/09/2006, 20h35
  4. Partager une base de données sous
    Par atemy dans le forum InterBase
    Réponses: 2
    Dernier message: 19/08/2006, 00h11
  5. Partager une base de données
    Par Boolean69 dans le forum Access
    Réponses: 3
    Dernier message: 16/06/2006, 10h44

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