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:
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):
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
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.
Partager