Imports System.Data
Imports System.Data.SqlClient
Public Class Form1
Private _conn As SqlConnection 'コネクション
Private _isRunning As Boolean = False '処理中フラグ
'--------------------------------------------------------------------------------
'非同期実行(コールバック)
'--------------------------------------------------------------------------------
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Button1.Click
''処理中チェック
If (_isRunning = True) Then
MessageBox.Show("処理中が終了するまでお待ちください。")
Exit Sub
End If
''接続文字
Dim builder As New SqlConnectionStringBuilder
With builder
.UserID = "sa"
.Password = ""
.DataSource = "venus"
.InitialCatalog = "Northwind"
.AsynchronousProcessing = True '非同期を有効
End With
''SQL接続
_conn = New SqlConnection(builder.ConnectionString)
''コマンド
''非同期を実感するためにWAITFOR DELAYで一時待機させます
Dim cmd As SqlCommand = New SqlCommand( _
"WAITFOR DELAY '00:00:02';SELECT * FROM Customers", _
_conn)
''コネクションオープン
_conn.Open()
''処理中フラグセット
_isRunning = True
''非同期で実行
''ここでは第2引数(stateObject)にコマンドを渡し、呼び出されたコールバックで利用します
cmd.BeginExecuteReader(New System.AsyncCallback(AddressOf ExecuteDataReaderCallback), _
cmd, Data.CommandBehavior.Default)
''
Console.WriteLine("cmd.BeginExecuteReader")
End Sub
'--------------------------------------------------------------------------------
'非同期コールバック
'--------------------------------------------------------------------------------
Private Sub ExecuteDataReaderCallback(ByVal iRes As IAsyncResult)
Try
Console.WriteLine("ExecuteDataReaderCallback")
''BeginExecuteReaderの第2引数に指定したコマンドを利用
Using sqlCm As SqlCommand = Ctype(iRes.AsyncState, SqlCommand)
Using sqlDr As SqlDataReader = sqlCm.EndExecuteReader(iRes)
If sqlDr.HasRows Then
While sqlDr.Read
Console.WriteLine(sqlDr("CompanyName"))
End While
End If
End Using
End Using
Catch ex As Exception
Console.WriteLine("***** ERROR *****:{0}", ex.Message)
Finally
''コネクションを閉じる
If (_conn IsNot Nothing) Then
If (_conn.State <> ConnectionState.Closed) Then
_conn.Close()
_conn.Dispose()
End If
End If
''処理中フラグセット
_isRunning = False
End Try
End Sub
End Class
|