vb.net backgroundworker mysql reader 到多个文本框

vb.net backgroundworker with mysql reader to multiple textboxes

我想每 1 秒 运行 一个 BGW 到 运行 一个 mySQL 查询并在我的表单中填写不同的文本框。

这是我的功能查询:

Public Sub AnrufAutoLaden()
    Dim mysqlconn As New MySqlConnection(ConnectionString)
    mysqlconn.Open()
    Dim query As String = "SELECT   CCE.callerid Telefonnummer,
                                    date_format(CCE.datetime_init, '%d-%m-%Y') Datum,
                                    TIME_FORMAT(CCE.datetime_init, '%H:%i') Uhrzeit,
                                    A.Alias Agent, 
                                    CONVERT( CAST(CE.name AS BINARY) USING UTF8) Kunde          
                            FROM call_center.current_call_entry CCE, call_center.agent A, call_center.campaign_entry CE
                            where CE.estatus = 'A'
                            AND A.estatus = 'A'
                            AND A.id = CCE.id_agent
                            AND CE.id_queue_call_entry = CCE.id_queue_call_entry
                            AND A.name ='" & LabelUsername.Text & "';"
    Dim mycmdIDForm As New MySqlCommand(query, mysqlconn)
    Dim rdr As Object = mycmdIDForm.ExecuteReader()
    If rdr.read() Then
        TBDashBCallerID.Text = rdr("Telefonnummer").ToString
        TBDashBDatum.Text = rdr("Datum").ToString
        TBDashBZeit.Text = rdr("Uhrzeit").ToString
        TBDashBAgent.Text = rdr("Agent").ToString
        TBDashBKunde.Text = rdr("Kunde").ToString
    End If
    mysqlconn.Close()
End Sub

我能够做到,但对于每个文本框,我需要 运行 一个单独的 BGW,如下所示:

Private Sub BGWAdminInfoV_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BGWAdminInfoV.DoWork
    Threading.Thread.Sleep(2000)
    If BGWAdminInfoV.CancellationPending = True Then
        e.Cancel = True
    Else
        Dim mysqlconn As New MySqlConnection(ConnectionString)
        mysqlconn.Open()
        Dim countquery2 As String = "SELECT     CCE.callerid Telefonnummer          
                            FROM call_center.current_call_entry CCE, call_center.agent A, call_center.campaign_entry CE
                            where CE.estatus = 'A'
                            AND A.estatus = 'A'
                            AND A.id = CCE.id_agent
                            AND CE.id_queue_call_entry = CCE.id_queue_call_entry
                            AND A.name ='" & LabelUsername.Text & "';;"
        Dim countcmd2 As MySqlCommand = New MySqlCommand(countquery2, mysqlconn)
        e.Result = countcmd2.ExecuteScalar().ToString()
        mysqlconn.Close()
    End If
End Sub
Private Sub BGWAdminInfoV_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BGWAdminInfoV.RunWorkerCompleted
    If e.Cancelled = True Then
    Else
        Me.Invoke(New MethodInvoker(Sub() TBDashBCallerID.Text = e.Result))
        BGWAdminInfoV.RunWorkerAsync()
    End If
End Sub

但是有没有办法用一个 BGW 来做到这一点。所以我 运行 每 1 秒一个 BGW 并且 return 所有五个值到所有五个文本框:

TBDashBCallerID.Text
TBDashBDatum.Text
TBDashBZeit.Text 
TBDashBAgent.Text
TBDashBKunde.Text

为什么要从 ExecuteReader 切换到 ExecuteScalar?只需使用您已有的相同 ADO.NET 代码,而不是将值放入 TextBoxes,而是将它们放入对象的属性或数组的元素中。然后,您从 RunWorkerCompleted 事件处理程序中的相同 object/array 中获取所有值,并填充所有 TextBoxes.

像这样开始:

BGWAdminInfoV.RunWorkerAsync(LabelUsername.Text)

然后这样做:

Private Sub BGWAdminInfoV_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BGWAdminInfoV.DoWork
    Dim mysqlconn As New MySqlConnection(ConnectionString)
    mysqlconn.Open()
    Dim query As String = "SELECT   CCE.callerid Telefonnummer,
                                date_format(CCE.datetime_init, '%d-%m-%Y') Datum,
                                TIME_FORMAT(CCE.datetime_init, '%H:%i') Uhrzeit,
                                A.Alias Agent, 
                                CONVERT( CAST(CE.name AS BINARY) USING UTF8) Kunde          
                        FROM call_center.current_call_entry CCE, call_center.agent A, call_center.campaign_entry CE
                        where CE.estatus = 'A'
                        AND A.estatus = 'A'
                        AND A.id = CCE.id_agent
                        AND CE.id_queue_call_entry = CCE.id_queue_call_entry
                        AND A.name = @name;"
    Dim mycmdIDForm As New MySqlCommand(query, mysqlconn)
    mycmdIDForm.Parameters.Add("@name", MySqlDbType.VarChar, 50).Value = e.Argument
    Dim rdr As Object = mycmdIDForm.ExecuteReader()
    Dim result As String()
    If rdr.Read() Then
        result = {rdr("Telefonnummer").ToString(),
                  rdr("Datum").ToString(),
                  rdr("Uhrzeit").ToString(),
                  rdr("Agent").ToString(),
                  rdr("Kunde").ToString()}
    End If
    mysqlconn.Close()

    e.Result = result
End Sub

Private Sub BGWAdminInfoV_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BGWAdminInfoV.RunWorkerCompleted
    If Not e.Cancelled AndAlso e.Result IsNot Nothing Then
        Dim result = DirectCast(e.Result, String())

        TBDashBCallerID.Text = result(0)
        TBDashBDatum.Text = result(1)
        TBDashBZeit.Text = result(2)
        TBDashBAgent.Text = result(3)
        TBDashBKunde.Text = result(4)
    End If
End Sub