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 :

Problème avec: BackgroundWorker + BD Access + DatargridView + SQL


Sujet :

VB.NET

  1. #1
    Membre confirmé
    Homme Profil pro
    Informaticien
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien
    Secteur : Service public

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Par défaut Problème avec: BackgroundWorker + BD Access + DatargridView + SQL
    Bonjour tout le monde,

    J'ai un soucis avec l'utilisation du BackgroundWorker (VB.net et base de données Access 2003). Dans mon formulaire principal (Form5) j'ai un bouton dont l'évènement click contient 'Form7.ShowDialog()' qui appelle mon formulaire secondaire. Dans ce formulaire, je fais le code 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
    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
    57
    58
    Public Class Form7
     
        Private Sub Form7_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.Text = Version
            BackgroundWorker1.RunWorkerAsync()
        End Sub
     
        Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
            Dim Criteria As String = ""
            Dim Token As Boolean = False
     
            If Form5.TextBox5.TextLength + Form5.TextBox7.TextLength + Form5.TextBox8.TextLength + Form5.TextBox9.TextLength + Form5.TextBox2.TextLength + Form5.TextBox3.TextLength > 0 Then
                Criteria = " WHERE "
            End If
            If Form5.TextBox5.TextLength > 0 Then
                Criteria = Criteria & "title1 LIKE '%" & Form5.TextBox5.Text.ToString & "%'"
                Token = True
            End If
            If Form5.TextBox7.TextLength > 0 Then
                If Token Then Criteria = Criteria & " AND "
                Criteria = Criteria & "title3 LIKE '%" & Form5.TextBox7.Text.ToString & "%'"
                Token = True
            End If
            If Form5.TextBox8.TextLength > 0 Then
                If Token Then Criteria = Criteria & " AND "
                Criteria = Criteria & "title4 LIKE '%" & Form5.TextBox8.Text.ToString & "%'"
                Token = True
            End If
            If Form5.TextBox9.TextLength > 0 Then
                If Token Then Criteria = Criteria & " AND "
                Criteria = Criteria & "title5 LIKE '%" & Form5.TextBox9.Text.ToString & "%'"
                Token = True
            End If
            If Form5.TextBox2.TextLength > 0 Then
                If Token Then Criteria = Criteria & " AND "
                Criteria = Criteria & "title6 LIKE '%" & Form5.TextBox2.Text.ToString & "%'"
                Token = True
            End If
            If Form5.TextBox3.TextLength > 0 Then
                If Token Then Criteria = Criteria & " AND "
                Criteria = Criteria & "title7 LIKE '%" & Form5.TextBox3.Text.ToString & "%'"
            End If
     
            Form5.DataGridView1.DataSource = Access("SELECT title1, title2, title3, title4, title5, title6, title7 FROM table" & Criteria, "table").Tables("table")
     
            Form5.DataGridView1.Columns(0).HeaderText = "Title1"
            Form5.DataGridView1.Columns(1).HeaderText = "Title2"
            Form5.DataGridView1.Columns(2).HeaderText = "Title3"
            Form5.DataGridView1.Columns(3).HeaderText = "Title4"
            Form5.DataGridView1.Columns(4).HeaderText = "Title5"
            Form5.DataGridView1.Columns(5).HeaderText = "Title6"
            Form5.DataGridView1.Columns(6).HeaderText = "Title7"
        End Sub
     
        Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
            Me.Close()
        End Sub
    End Class
    Avec la fonction 'Access' (qui fonctionne sans problème):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Public Function Access(ByVal RequeteSQL As String, ByVal Table As String) As DataSet
            Dim MyAdapter As OleDbDataAdapter= New OleDbDataAdapter(RequeteSQL, MyConnection)
     
            Try
                MyDataSetTemp.Clear()
                MyAdapter.Fill(MyDataSetTemp, Table)
                'A ce niveau les données résultantes de la requete se trouvent dans => MyDataSet.Tables(0)
            Catch ex As Exception
                MessageBox.Show("Failed to connect to database! " & ex.Message)
            End Try
            Return MyDataSetTemp
            MyDataSetTemp.Clear()
        End Function
    La ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form5.DataGridView1.DataSource = Access("SELECT title1, title2, title3, title4, title5, title6, title7 FROM table" & Criteria, "table").Tables("table")
    dure normalement plus de 2 minutes si Criteria = "" (table contient plus de 115000 records), j'ai donc mis sur mon formulaire secondaire une progressbar en mode 'Marquee'. Sans le BackgroundWorker la progressbar ne fonctionne pas et l'exception 'contextswitchdeadlock' est parfois levée. Avec le BackgroundWorker, la progressbar fonctionne, il n'y a plus d'exception et le traitement ne dure que quelques secondes. Mais mon 'Form5.DataGridView1' reste désespérément vide.

    Help me please.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 196
    Par défaut
    tes textbox contiennent quelque chose au chargement de la fenetre ou t'as un autre bouton pour relancer la recherche ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            Return MyDataSetTemp
            MyDataSetTemp.Clear()
    ici vu que tu "return", la ligne d'après ne sera jamais executée


    il faut utiliser des DBparameters plutot que de faire des concaténations étranges et risquées


    contextswitchdeadlock ca semble vouloir dire qu'il y a des threads qui se bloquent mutuellement, je pense pas que c'est dans access, donc ca doit etre le backgroundworker qui bloque quand tu veux accéder aux colonnes du datagrid
    le mieux serait surement de déporter la getion du datagrid dans une autre sub, et l'appeler avec un délégué sur le thread principal (rechercher delegate sub sur google ou ici)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    C'est normal que tu aies une erreur : seul le thread principal peut accéder à l'interface graphique. Or, tu y accèdes dans le code du worker, donc dans un autre thread. Il faudrait donc que tu stockes le résultat de la méthode Access dans le Result de l'évènement DoWork, et que dans l'évènement RunWorkerCompleted tu initialises ton DataGridView avec ce résultat.

    Citation Envoyé par sperot51 Voir le message
    il faut utiliser des DBparameters plutot que de faire des concaténations étranges et risquées
    Je suis d'accord sur le principe, mais dans un cas comme ça on ne peut pas vraiment faire autrement... ce n'est pas seulement des paramètres qui changent, c'est toute la requête qui est dynamique. Au mieux, on peut ajouter un paramètre pour chaque nouveau critère, mais il faut quand même faire des concaténations...

  4. #4
    Membre confirmé
    Homme Profil pro
    Informaticien
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien
    Secteur : Service public

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Par défaut
    Bonjour sperot51, bonjour tomlev,

    Merci de vos réponses. J'ai stocké le résultat de ma fonction 'Access' dans e.Result et j'ai donc fait le 'Form5.DataGridView1.DataSource = e.Result' dans le RunWorkerCompleted. Cela est mieux mais pour ce qui est de l'affichage, c'est lent,très lent, trop lent. De plus la ProgressBar est figée pendant ce laps de temps. J'ai donc opté pour une autre méthode: je garnis mon DataGridView ligne par ligne dans une boucle et je gère une ProgressBar en style 'Continuous'. C'est tout aussi lent mais au moins l'utilisateur voir une barre de progression avancer (lentement, mais c'est mieux que rien) et sait donc qu'il y a un traitement en cours et que ce n'est pas un plantage du système. J'ai au moins pu apprendre à utiliser un BackgroundWorker.

    Encore merci à vous deux.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Pour info, tu peux utiliser l'évènement ProgressChanged du backgroundworker pour connaître la progression de la tâche. Cet évènement est déclenché sur le thread principal (donc tu peux accéder à l'interface graphique) quand tu appelles la méthode ReportProgress pendant le traitement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec les apostrophes dans le sql en VBA
    Par cyrilboulan dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 14/03/2017, 10h11
  2. [CR11] Problème avec un champ d'expression SQL
    Par Benoit30 dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 30/05/2006, 16h22
  3. Problème avec l'argument DISTINCT en SQL
    Par Jeankiki dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/04/2006, 12h27
  4. [vba] Problème de pass d'access vers sql server
    Par fix105 dans le forum Access
    Réponses: 5
    Dernier message: 22/02/2006, 16h31
  5. [SQL-Server] Problème avec odbc et ma connexion SQL Server
    Par vodevil dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 09/12/2005, 10h04

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