タイトル | : Re^2: 抽出クエリを非同期で実行し、 DataSet に入れる方法 |
記事No | : 6000 |
投稿日 | : 2007/08/02(Thu) 18:06 |
投稿者 | : じゅん |
> BackgroundWorker クラスを併用してみては如何でしょう。
次のようにしてみました。 とりあえず、期待通りの動作にはなったのですが、 問題個所・改良すべき個所はありますか?
BackgroundWorker クラスを使うのは初めてなもので、 よろしくお願いいたします。 (下のコードもネットからダウンロードしたものを 自分用にアレンジしただけです・・・^^;)
'=========== 以下、サンプルコード =============================================
' Button1 と BackgroundWorker1 を追加しておく。
Dim ds As New System.Data.DataSet Dim isComplete As Boolean
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' adapter.Fill が完了したかどうかのフラグ isComplete = False
' adapter.Fill を非同期で実行( adapter.Fill が完了する前に次のコードを実行させる) BackgroundWorker1.RunWorkerAsync()
' adapter.Fill が完了するまでループ(画面が真っ白にならないように DoEvents を実行しつづける) Do Application.DoEvents() Loop While isComplete = False
' レコード数分ループ For Each row As System.Data.DataRow In ds.Tables(0).Rows
' カラム数分ループ For col As Integer = 0 To ds.Tables(0).Columns.Count - 1
' Null を空の文字列に置き換える(下の Join でエラーが出ないようにする為) row(col) = row(col).ToString
Next
' 1レコードのデータをカンマ区切りで連結したものをイミディエイトウィンドウに出力 Debug.Print(Join(row.ItemArray, ","))
Next
End Sub
Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
' データベースに接続 Dim connection As New System.Data.Odbc.OdbcConnection("Driver={xxx};na=xxx;db=xxx;uid=xxx;pwd=xxx;")
Dim adapter As New System.Data.Odbc.OdbcDataAdapter("select * from table", connection)
' 抽出クエリの実行 adapter.Fill(ds) '<--- ここ
' データベースから切断 connection.Close()
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted isComplete = True End Sub
'=========== 以上、サンプルコード =============================================
|