⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch9_demoform002.vb

📁 文件与IO存取,数据绑定,数据库更新,章立民的程序
💻 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 + -