Powered By 画RSS

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[C#]データベースに接続 backgroundWorker追加

C# BackgroundWorkerを使用してみる

.
以前書いたDB接続記事のだと、ちょっと多いレコード読み込むと画面が真っ白になって、操作不能になる。
それは放置していた問題だったが、最近それでかなりイライラさせられた。
なので前回のコードにBackgroundWorkerを加え、バックグラウンドでレコードを取得できるように改修することにした。
改修するにあたって、MSDNと@ITの記事を参考にした。

■参考記事
Windows フォーム コントロールのスレッド セーフな呼び出しを行う
時間のかかる処理をバックグラウンドで実行するには?[2.0のみ、C#、VB]

正直言うと、MSDNにかなり分かりやすいサンプルコードがあって驚いた。
一部分なんか丸々使えた。感謝。
@ITのは、実際にソースコードをダウンロードして、BackgroundWorkerの動きを確認するのに役立った。

で、できたコードは以下に記載。
縦に長すぎて、全体が把握しづらい。
あと、うちのブログには横幅が足りないと思うんだ・・・。
.

.

public partial class Form1 : Form
{
    delegate void SetTextCallback(string text); 

    public Form1()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        _button.Enabled = false;
        //バックグラウンドの処理を開始
        _backgroundWorker.RunWorkerAsync();
    }
    private void _backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        DataSet _readDB = new DataSet();
        string ConnectionString = "Persist Security Info=False;User ID=sa;Password=XXXXX;Initial Catalog=DBNAME; Server=IPアドレス;";

        //SQLと接続文字列を指定してインスタンスを初期化
        SqlDataAdapter sqlAdapter = new SqlDataAdapter("select * from dbo.tbl_XXXXX ", ConnectionString);

        //結果文字列保持用
        string resultmsg = "";

        try
        {
            //DataSetにデータを読み込み
            sqlAdapter.Fill(_readDB);
            //区切り文字
            string sptword = "\t";
            foreach (DataRow rowline in _readDB.Tables[0].Rows)
            {                   
                string line = "";
                foreach (object rowitem in rowline.ItemArray)
                {
                    line += rowitem.ToString().Trim() + sptword;
                }
                line += Environment.NewLine;
                SetText(line);
            }
            resultmsg = "Result:OK";
        }
        catch (System.Data.SqlClient.SqlException msg)
        {
            resultmsg = msg.Message;
        }
        finally
        {
            e.Result = resultmsg;
        }
    }
    private void SetText(string text)
    {
        if (_textBoxquery.InvokeRequired)
        {
            SetTextCallback d = new SetTextCallback(SetText);
            this.Invoke(d, new object[] { text });
        }
        else
        {
            _textBoxquery.Text += text;
        }
    }
    private void _backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        // テキストボックスに処理結果を取得 
        _textBoxresult.Text = e.Result.ToString();
        _button.Enabled = true;
    }
}

.
画面はテキストボックス2つ、ボタン1つの構成。
button1を押すと、バックグラウンドでDBからレコードをテキストボックスに取得・・・という流れ。
前回の記事におおまかなエラー処理が加わっているものの、メインの処理は変わっていない。

これでボタン押して固まることがなくなった。
.

猫でもわかるC#プログラミング 第2版 (猫でもわかるシリーズ) 猫でもわかるC#プログラミング 第2版 (猫でもわかるシリーズ)
粂井 康孝

ソフトバンククリエイティブ
売り上げランキング : 179567

Amazonで詳しく見る
.
プログラマが知るべき97のこと プログラマが知るべき97のこと
和田 卓人,Kevlin Henney,夏目 大

オライリージャパン
売り上げランキング : 3280

Amazonで詳しく見る

.

関連記事
スポンサーサイト

この記事へのコメント

トラックバック

URL :

■スポンサードリンク
■プロフィール

ベタログ

管理人 : ベタログ (Twitterアカウント

思い立ったら、ジャンルを気にせず記事にする。それが自由というものだ。
そんな管理方針。
主に取り扱ってる事:オンラインゲーム(SDGO/Travian/ロードオブナイツ)、プログラミングメモ、ネット小説/書籍の感想/観葉植物など。

■まとめ記事
■カテゴリ
■最新記事
■PICKUP

個人的に押しているモノ


魚里高校ダンジョン部! 藻女神様と行く迷宮甲子園
魚里高校ダンジョン部! 藻女神様と行く迷宮甲子園
■感想記事
これぞ青春エンタメ小説。熱いですよ!

オーバーロード1 不死者の王
オーバーロード1 不死者の王
■感想記事
最強軍団が異世界を蹂躙するファンタジー。Web版も読めますが、凄まじい加筆がされているため、Web版読者も楽しめます。
■お勧め品
■最新コメント
■月別アーカイブ
検索フォーム
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。