📄 ch9_demoform001.vb
字号:
Option Strict On
Imports System.Data.SqlClient
Public Class CH9_DemoForm001
Private Sub btnPollingAsynch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPollingAsynch.Click
' 利用 SqlConnectionStringBuilder 对象来构建连接字符串。
Dim connectStringBuilder As New SqlConnectionStringBuilder()
connectStringBuilder.DataSource = "(local)\SQLExpress"
connectStringBuilder.InitialCatalog = "北风贸易"
connectStringBuilder.IntegratedSecurity = True
' 启用异步处理。
connectStringBuilder.AsynchronousProcessing = True
' 使用一个 StopWatch 对象来计算执行时间以便检视效率。
Dim myWatch As Stopwatch = New Stopwatch()
' 开始计时。
myWatch.Start()
Using myConnection As SqlConnection = New SqlConnection(connectStringBuilder.ConnectionString)
Try
' 建立所要异步执行的三道 Transact-SQL 语句,其中第一道
' 的 WAITFOR 语句会刻意暂停三秒钟来仿真长时间的数据库存取
' 作业,以方便我们执行轮询作业。
Dim myQuery As String = _
"WAITFOR DELAY '00:00:03';" & _
"SELECT * FROM 章立民研究室;" & _
"SELECT * FROM 飞狐工作室"
Dim myCount As Integer = 0
Dim myCommand As SqlCommand = New SqlCommand(myQuery, myConnection)
myConnection.Open()
' 执行数据命令的 BeginExecuteReader 方法,此方法会传回一个 IAsyncResult,
' 藉由轮询 IAsyncResult 的 IsCompleted 属性可以知道异步操作是否执行完毕。
Dim myResult As IAsyncResult = myCommand.BeginExecuteReader()
While Not myResult.IsCompleted
myCount = myCount + 1
' 在异步查询结果传回之前,我们会持续更新状态列。
queryStatusStatusBar.Step = 1
queryStatusStatusBar.Value = myCount
If myCount = 100 Then
myCount = 0
End If
elapsedTime.Text = myWatch.ElapsedMilliseconds.ToString() + " ms"
elapsedTime.Refresh()
End While
' 完成 Transact-SQL 语句的异步执行作业之后,
' 务必呼叫数据命令的 EndExecuteReader 方法来结束异步执行,
' 并传回最终的 SqlDataReader。
Using myReader As SqlDataReader = myCommand.EndExecuteReader(myResult)
' 停止计时。
myWatch.Stop()
' 在此可以提取异步查询的结果并显示在窗体上。
Dim ds As New DataSet
' 将数据读取器的两个结果集分别加载成数据集对象 ds 当中的
' 「章立民研究室」与「飞狐工作室」数据表。
ds.Load(myReader, LoadOption.OverwriteChanges, New String() {"章立民研究室", "飞狐工作室"})
' 将「章立民研究室」数据表的数据记录显示在 DataGridView 控件中。
Me.LimingchDataGridView.DataSource = ds.Tables(0)
' 将「飞狐工作室」数据表的数据记录显示在 DataGridView 控件中。
Me.FoxDataGridView.DataSource = ds.Tables(1)
End Using
' 在窗体上显示各项信息。
elapsedTime.Text = myWatch.ElapsedMilliseconds.ToString() + " ms"
messageReturned.Text = "使用轮询返回异步查询结果。"
queryStatusStatusBar.Value = 100
Catch ex As SqlException
MessageBox.Show(ex.Message.ToString(), "请注意")
Catch ex As InvalidOperationException
MessageBox.Show(ex.Message.ToString(), "请注意")
Catch ex As Exception
MessageBox.Show(ex.Message.ToString(), "请注意")
End Try
End Using
End Sub
Private Sub CH9_DemoForm001_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
End Class
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -