我已经通过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"或者#34; Loaded"(我发现Form_Closed虽然),但我不能。
我想它与线程,程序睡眠有关,否则。我希望有人可以帮助我。非常感谢你们!
答案 0 :(得分: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是否为null(它包含异常)并做出相应的反应。
答案 1 :(得分:0)
使用timer
。
在表单加载事件中,启动timer
(将间隔设置为2秒或您想要的任何内容)。当timer
ticks
调用您的连接方法时。在testDBconnection()
方法开始时,请停止timer
并将其丢弃,因为您不再需要它。
答案 2 :(得分:0)
你不应该在表单加载时使用Form_Load事件来触发事件,你应该覆盖OnLoad()方法,这样就可以控制代码被触发的时间(多个订阅者可以监听Form_Load和你不知道他们将以什么顺序跑。)
让屏幕刷新的最快最脏的方法是添加
Application.DoEvents();
更改标签后,会强制屏幕更新。总的来说,虽然这是不好的做法,上面的背景线程将是一个更好的长期解决方案。