3

我已经通过stackoverflow搜索但找不到答案。不知道能不能把这个问题说清楚。反正我不是说英语的人=.=

我正在使用 c# 和 Visual Studio 2010 进行开发。我正在制作一个供用户登录的表单,我希望这个表单在加载事件期间测试 sql server 连接。

看起来很简单,代码是:

    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();

但是,这需要一些异常处理。如果事件中发生异常DoWork,那么您可以在RunWorkerCompleted事件中检查 ev.Error 是否为空(它包含异常)并做出相应的反应。

于 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 回答