###前提・実現したいこと
sqlDataAdapter.fillを別のスレッドで実行したい
###発生している問題・エラーメッセージ
別スレッドでsqlDataAdapter.fillを実行すると、その時点でスレッドが終了する。 以下のプログラムでいうと args.ColumnsCount = SqlDataAdapter.Fill(args.ResultTable);の後にすぐに RunWorkerCompleted関数に飛ぶ。そして、args.ResultTable内はnullである。 ちなみにsqlcommandは SELECT TOP 1 * FROM [dbo].[table] です。
###該当のソースコード
public class A{ private SqlConnection connection; private string sqlcCommand; public delegate void SQLResultEventHandler(object sender, SQLResultEvenArgs e); public event SQLResultEventHandler handler; private SQLResultEvenArgs args; public void Fill() { BackgroundWorker bw = new BackgroundWorker(); bw.DoWork += new DoWorkEventHandler(ThreadFill); bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(RunWorkerCompleted); bw.RunWorkerAsync();/*SQLスレッド実行*/ } private void ThreadFill(object sender, DoWorkEventArgs element) { args = new SQLResultEvenArgs(); SqlDataAdapter SqlDataAdapter = new SqlDataAdapter (sqlcCommand,connection.ConnectionString); /*sqlcCommand、connection.ConnectionStringの設定はあっています。*/ SqlDataAdapter.SelectCommand.CommandTimeout = 1000; args.ColumnsCount = SqlDataAdapter.Fill(args.ResultTable);/*args.ResultTableにデータが入らない。*/ /*このあとに処理を書いても実行されない*/ } private void RunWorkerCompleted (object sender, RunWorkerCompletedEventArgs element) { OnSQLResult(args); } protected virtual void OnSQLResult(SQLResultEvenArgs e) { handler(this, e); /*イベント発生*/ } } public class SQLResultEvenArgs : EventArgs { public DataTable ResultTable { get; set; } public int ColumnsCount { get; set; } }
###補足情報(言語/FW/ツール等のバージョンなど)
C#
.NetFramework 4.6.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。