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
我想每 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