3

stackoverflowを検索しましたが、答えが見つかりません。この質問をはっきりとできるかどうかわかりません。とにかく私は英語を話す人ではありません=。=

開発にはC#とVisualStudio2010を使用しています。ユーザーがログインするためのフォームを作成しています。このフォームで、ロードイベント中にSQLサーバー接続をテストしたいと思います。

簡単そうです、コードは次のとおりです。

    private void testDBconnection()
    {
        label3.Text = "Connecting to Database Server......";

        SqlServerConnection ssc = new SqlServerConnection();
        bool conOK = ssc.isConnectable(ssc.makeConnectionString(
            SqlServerConnParamters.SqlServerIPAddress,
            SqlServerConnParamters.AccountValidationDatabaseName,
            SqlServerConnParamters.SqlServerUserName,
            SqlServerConnParamters.SqlServerPassword,
            5));
        if (conOK)
        {
            label3.Text = "";
        }
        else
        {
            label3.Text = "Database connection failed";
            button1.Enabled = false;
        }
    }

このメソッドをForm_Loadイベントに入れました。

ただし、実行時には、このフォームが表示される前でもこのプロセスが開始されます。また、検証はデフォルトで15秒間続く可能性があります(5に設定しましたが、時間もかかります)。接続に問題がある場合は、プログラムを開くことができなかったように表示されますが、データベースへの接続に失敗した後に表示されます。

私の意図は、Label3が「データベースサーバーに接続しています......」と表示してユーザーに通知し、接続が失敗したかどうかをユーザーに通知することです。

「Loaded_Complete」や「​​Loaded」などのフォームイベントを見つけようとしましたが(Form_Closedは見つかりました)、見つかりませんでした。

スレッドやプログラムのスリープなどと関係があると思います。誰かがこれについて私を助けてくれることを願っています。どうもありがとう!

4

3 に答える 3

2

このようにBackgroundWorkerを使用します。これにより、データベースのチェック操作が延期され、フォームの読み込みがロックされなくなります。

label3.Text = "Connecting...";
button1.Enabled = false;

var bkw = new BackgroundWorker();
bkw.DoWork += (s, ev) =>
    {
        SqlServerConnection ssc = new SqlServerConnection();
        ev.Result = ssc.isConnectable(ssc.makeConnectionString(
                        SqlServerConnParamters.SqlServerIPAddress,
                        SqlServerConnParamters.AccountValidationDatabaseName,
                        SqlServerConnParamters.SqlServerUserName,
                        SqlServerConnParamters.SqlServerPassword, 5));
    };

bkw.RunWorkerCompleted += (s, ev) =>
    {
        if ((bool)ev.Result == true)
        {
            label3.Text = "Connected";
            button1.Enabled = true;
        }
        else
        {
            label3.Text = "Database connection failed";
        }

        bkw.Dispose();
    };

bkw.RunWorkerAsync();

ただし、これにはいくつかの例外処理が必要です。イベントで例外が発生した場合、イベントでev.Error が null であるかどうか (例外が含まれているかどうDoWorkか) を確認し、それに応じて対応できます。RunWorkerCompleted

于 2013-03-07T07:55:46.663 に答える
0

を使用しtimerます。フォーム ロード イベントで開始しますtimer(間隔を 2 秒または必要に応じて設定します)。timer ticks接続方法を呼び出します。メソッドの開始時に、不要になったためtestDBconnection()、を停止して破棄します。timer

于 2013-03-07T07:43:47.167 に答える
0

Form_Load イベントを使用してフォームが読み込まれたときにイベントを発生させるべきではありません。代わりに OnLoad() メソッドをオーバーライドして、コードがいつ起動されるかを制御する必要があります (複数のサブスクライバーが Form_Load をリッスンしている可能性がありますが、そうではありません)。どのような順序で実行されるかはわかりません)。

画面を更新するための最も迅速で汚れた方法は、追加することです

Application.DoEvents();

ラベルを変更すると、画面が強制的に更新されます。一般に、これは悪い習慣であり、上記のバックグラウンド スレッドは長期的にはより良い解決策になります。

于 2013-03-07T08:09:33.773 に答える