📄 ch9_demoform002.vb
字号:
Option Strict On
Imports System.Data.SqlClient
Public Class CH9_DemoForm002
' 建立下面三个委派,以便能够显示使用者讯息、计时讯息、以及 DataGridView 数据。
Private Delegate Sub DisplayInfoDelegate(ByVal Text As String)
Private Delegate Sub DisplayTimeInfoDelegate(ByVal Text As String)
Private Delegate Sub DisplayDataGridViewDelegate(ByVal myDataSet As DataSet)
' 本范例建立一个类别层级(或是说外部)的连接对象,以方便将其关闭。
Private myCallbackConnection As SqlConnection
' 本范例建立一个类别层级(或是说外部)的 StopWatch 对象,以便当执行绪完成
' 处理时能够存取它。我们使用 StopWatch 对象来计算执行时间以便检视回调的效率。
Private myCallBackWatch As Stopwatch = New Stopwatch()
' 我们会在按钮的 Click 事件处理例程中呼叫 RetrieveByCallBack 方法,
' 以便利用回调(Callback)来执行异步查询。
Private Sub btnCallBackAsynch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCallBackAsynch.Click
Me.btnCallBackAsynch.Enabled = False
' 归零。
myCallBackWatch.Reset()
' 利用 SqlConnectionStringBuilder 对象来构建连接字符串。
Dim connectStringBuilder As New SqlConnectionStringBuilder()
connectStringBuilder.DataSource = "(local)\SQLExpress"
connectStringBuilder.InitialCatalog = "北风贸易"
connectStringBuilder.IntegratedSecurity = True
' 启用异步处理。
connectStringBuilder.AsynchronousProcessing = True
Dim myCommand As SqlCommand
Try
DisplayResults("")
' 建立连接。
myCallbackConnection = New SqlConnection(connectStringBuilder.ConnectionString)
' 建立所要异步执行的三道 Transact-SQL 语句,其中第一道
' 的 WAITFOR 语句会刻意暂停三秒钟来仿真长时间的数据库存取
' 作业,以方便我们展现异步作业。
Dim myQuery As String = _
"WAITFOR DELAY '00:00:03';" & _
"SELECT * FROM 自行车产品相片;" & _
"SELECT * FROM 章立民研究室"
' 建立一个数据命令。
myCommand = New SqlCommand(myQuery, myCallbackConnection)
' 开启连接。
myCallbackConnection.Open()
' 在我们开始执行异步查询之前,先在接口上显示一个讯息给使用者。
DisplayResults("执行中...您仍然可以继续进行其它操作")
' 开始计时。
myCallBackWatch.Start()
' 建立一个新的 AsyncCallBack 对象并将 HandleCallback 传递给它。
Dim myCallBack As AsyncCallback = New AsyncCallback(AddressOf HandleCallback)
' 现在我们可以开始执行异步查询作业。
myCommand.BeginExecuteReader(myCallBack, myCommand)
Catch ex As Exception
DisplayResults(String.Format(ex.Message.ToString()))
myCallbackConnection.Close()
End Try
End Sub
' 此方法会在异步作业处理期间以及完成后显示使用者消息正文。
Private Sub DisplayResults(ByVal Text As String)
Me.messageReturned.Text = Text
End Sub
' 此方法会在回呼(Callback)完成时显示时间讯息。
Private Sub DisplayTimeResults(ByVal Text As String)
Me.elapsedTime.Text = Text
End Sub
' 此方法会在处理完毕以及回呼(Callback)完成时将所提取的数据显示在 DataGridView 控件中,
' 并且再度启用「开始执行异步查询」按钮。
Private Sub DisplayDataResults(ByVal myDataSet As DataSet)
' 将「自行车产品相片」数据表的数据记录显示在 DataGridView 控件中。
Me.ProductPhotoDataGridView.DataSource = myDataSet.Tables(0)
' 将「章立民研究室」数据表的数据记录显示在 DataGridView 控件中。
Me.LimingchDataGridView.DataSource = myDataSet.Tables(1)
Me.btnCallBackAsynch.Enabled = True
End Sub
' 此方法会在回呼(Callback)完成时被呼叫。它控制所有的回呼并负责处理结果。
Private Sub HandleCallback(ByVal myResult As IAsyncResult)
Try
' 在此,我们会藉由存取 IAsyncResult 参数的 AsyncState 属性来取得原始的数据命令对象。
Dim myCommand As SqlCommand = CType(myResult.AsyncState, SqlCommand)
' 完成数据的提取作业。
Using myReader As SqlDataReader = myCommand.EndExecuteReader(myResult)
' 停止计时。
myCallBackWatch.Stop()
' 建立所有要显示在窗体上的讯息。
Dim userMessage As String = "数据已经通过回调(Callback)返回!"
Dim myCallBackTime As String = myCallBackWatch.ElapsedMilliseconds.ToString() & " ms"
' 在此可以提取异步查询的结果并显示在窗体上。
Dim ds As New DataSet
' 将数据读取器的两个结果集分别加载成数据集对象 ds 当中的
' 「自行车产品相片」与「章立民研究室」数据表。
ds.Load(myReader, LoadOption.OverwriteChanges, New String() {"自行车产品相片", "章立民研究室"})
' 由于我们不能够直接与窗体互动,因此必须替每一个委托建立一个新的执行个体
' 并呼叫每一个委派的方法,如此才能够显示使用者讯息、时间讯息、并且将数据集
' 当中的资料表系结至 DataGridView 控件。
Dim myUserDelegate As DisplayInfoDelegate = New DisplayInfoDelegate(AddressOf DisplayResults)
Me.Invoke(myUserDelegate, userMessage)
Dim myTimeDelegate As DisplayTimeInfoDelegate = New DisplayTimeInfoDelegate(AddressOf DisplayTimeResults)
Me.Invoke(myTimeDelegate, myCallBackTime)
Dim myDataDelegate As DisplayDataGridViewDelegate = New DisplayDataGridViewDelegate(AddressOf DisplayDataResults)
Me.Invoke(myDataDelegate, ds)
End Using
Catch ex As Exception
' 您必须自行处理异常。欲显示错误讯息,您必须再次建立委托的实例,
' 并且将所要显示的错误讯息传递给方法。
Me.Invoke(New DisplayInfoDelegate(AddressOf DisplayResults), String.Format(ex.Message))
Finally
' 关闭连接。
myCallbackConnection.Close()
End Try
End Sub
Private Sub ProductPhotoDataGridView_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles ProductPhotoDataGridView.CellContentClick
End Sub
End Class
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -