0

SQL Server への接続を開けない場合に備えて、if ステートメントを作成し、ラベルを表示し、代わりに別のフォームを表示しようとしています。コードは次のとおりです。

private void button1_Click(object sender, EventArgs e)
{
    SqlConnection conn = new SqlConnection("Data Source=xxx.ac.uk;Initial Catalog=XXXX;User ID=xxxx;Password=xxxxx");

    try
    {
       // string sql = "SELECT * FROM datatable";
        SqlCommand mycommand = new SqlCommand("SELECT * FROM datatable", conn);
        try
        {
            conn.Open();
            mycommand.ExecuteNonQuery();
        }
        finally
        {
                if (mycommand != null)
                label1.Visible = true;
                label1.Text = "Failed to Access Database! Please log into VPN Using The Link Below.";
        }
    }
    finally
    {
        if (conn != null)

            this.Hide();
        Form1 form = new Form1();
        form.Show();


    }

    }

}

}

ファイルをオフラインで実行すると、タイムアウトの問題が発生し、例外が発生してアプリを使用できなくなります。if ステートメントで接続があるかどうかを確認してからフォームに移動し、接続がない場合はラベルを表示します。

よろしくお願いします。

4

3 に答える 3

1

あなたの方法は少しやりすぎだと思います。テーブルをクエリする必要はありません。接続を開くだけで十分です。

var canAccessDB = false;

try
{
    conn.Open();
    canAccessDB = true; // Will only get here if Open() is successful
}
catch
{
    // nothing needed here
}
finally
{
    if (conn != null)
        conn.Dispose(); // Safely clean up conn
}

if (!canAccessDB)
{
    label1.Visible = true;
    label1.Text = "Failed to Access Database! Please log into VPN Using The Link Below.";
}
else
{
    this.Hide();
}

Form1 form = new Form1();
form.Show();
于 2013-03-12T21:54:05.593 に答える
0

接続が失敗した場合にSqlExceptionをキャッチし、ユーザーにメッセージを表示することができます

using (SqlCommand mycommand = new SqlCommand("SELECT * FROM datatable", conn))
{
    try
    {
        conn.Open();
        mycommand.ExecuteNonQuery();
    }
    catch (SqlException ex)
    {
        label1.Visible = true;
        label1.Text = string.Format("Failed to Access Database! Please log into VPN Using The Link Below.\r\n\r\nError: {0}", ex.Message);
        return;
    }

    if (conn != null)
    {
        this.Hide();
        Form1 form = new Form1();
        form.Show();
    }
}
于 2013-03-12T22:01:24.207 に答える
0

finallyブロックは毎回実行されます。tryブロックの内容に問題がある場合に備えて、実行するコードを含むcatchブロックが必要です。

于 2013-03-12T21:53:50.820 に答える