gpt4 book ai didi

.net - 如何在执行大型 SQLCommand VB.Net 时显示进度条

转载 作者:行者123 更新时间:2023-12-02 21:43:28 26 4
gpt4 key购买 nike

我有一个大的 SQL 命令,通常返回 20 000 - 100 000 行数据。但是,一旦我调用executeMyQuery函数,程序就会挂起几秒钟,具体取决于返回的大小。

我只返回一列。

如何在该命令运行时显示进度条?

也许在线程或其他东西中(我没有线程经验)

这是我的代码(参数是从3个不同的combobox.selectedItem发送的):

    Public Function executeMyQuery(dbname As String, colname As String, tblname As String)
Try
ListBox1.Items.Clear()
If Not String.IsNullOrWhiteSpace(connString) Then
Using cn As SqlConnection = New SqlConnection(connString)
cn.Open()
Using cmd As SqlCommand = New SqlCommand()
cmd.Connection = cn
Dim qry As String
qry = String.Format("select distinct [{0}] from {1}.dbo.{2} where [{0}] is not null", colname, dbname, tblname)
cmd.CommandText = qry
cmd.CommandTimeout = 0

Dim count As Integer
Using myReader As SqlDataReader = cmd.ExecuteReader()
While (myReader.Read())
count += 1
ListBox1.Items.Add(count.ToString & ". " & myReader.GetString(0))
End While
End Using
End Using
End Using
End If
cn.Close()
Catch ex As Exception
MsgBox("Error Occured : " & ex.Message)
cn.Close()
End
End Function

最佳答案

这里是如何使用 VB.Net 4.0 进行异步工作的简化示例。

假设您有一个包含以下导入的表单,

Imports System.Windows.Forms
Imports System.Threading
Imports System.Threading.Tasks

该表单有两个控件

Private WithEvents DoSomthing As Button
Private WithEvents Progress As ProgressBar

在您的应用程序中的某个位置,我们有一个名为 ExecuteSlowStuffFunction,此函数相当于您的 executeMyQuery。重要的部分是 Action 参数,函数用它来显示它正在取得进展。

Private Shared Function ExecuteSlowStuff(ByVal progress As Action) As Integer
Dim result = 0
For i = 0 To 10000
result += i
Thread.Sleep(500)
progress()
Next

Return result
End Function

假设这项工作是通过单击 DoSomething Button 启动的。

Private Sub Start() Handled DoSomething.Click
Dim slowStuff = Task(Of Integer).Factory.StartNew(
Function() ExceuteSlowStuff(AddressOf Me.ShowProgress))
End Sub

您可能想知道 ShowProgress 从哪里来,这是更困惑的部分。

Private Sub ShowProgress()
If Me.Progress.InvokeRequired Then
Dim cross As new Action(AddressOf Me.ShowProgress)
Me.Invoke(cross)
Else
If Me.Progress.Value = Me.Progress.Maximum Then
Me.Progress.Value = Me.Progress.Minimum
Else
Me.Progress.Increment(1)
End If

Me.Progress.Refresh()
End if
End Sub

请注意,由于可以从另一个线程调用 ShowProgress,因此它会检查跨线程调用。在这种情况下,它会在主线程上调用自身。

关于.net - 如何在执行大型 SQLCommand VB.Net 时显示进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16688990/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com