【问题标题】:How to limit the wait time for SqlConnection.Open()?如何限制 SqlConnection.Open() 的等待时间?
【发布时间】:2009-11-28 03:01:09
【问题描述】:
我想测试连接字符串是否正确,所以我创建了一个新的 SqlConnection,称为它的 Open() 方法。但是当连接字符串的server/data_source部分出错时,我必须等待很长时间才能返回。
我尝试在连接字符串中添加连接超时,但没有成功;
我尝试在另一个线程中打开连接,然后在几秒钟后调用 Thread.Abort()。
他们都没有工作。
那么正确的方法是什么?
谢谢。
【问题讨论】:
标签:
timeout
database-connection
【解决方案1】:
经过研究,我找到了解决方案(http://www.improve.dk/blog/2008/03/10/controlling-sqlconnection-timeouts),我稍微修改了一下。如果没有抛出异常,则连接字符串有效。
var alive = true;
string error = null;
var success = false;
// ReSharper disable AccessToModifiedClosure
// ReSharper disable UseObjectOrCollectionInitializer
var thread = new Thread(() =>
{
try
{
var connection = new SqlConnection(connectionString);
connection.Open();
connection.Close();
if (alive)
success = true;
}
catch (SqlException ex)
{
if (alive)
error = ex.Message;
}
catch (ThreadAbortException)
{
}
finally
{
if (connection.State == ConnectionState.Open)
connection.Close();
}
});
// ReSharper restore AccessToModifiedClosure
// ReSharper restore UseObjectOrCollectionInitializer
thread.IsBackground = true;
var sw = Stopwatch.StartNew();
thread.Start();
var timeout = TimeSpan.FromSeconds(3);
while (sw.Elapsed < timeout)
thread.Join(TimeSpan.FromMilliseconds(200));
sw.Stop();
if (!success)
{
alive = false;
throw new Exception(error ?? "Connection timeout, please check the connection string.");
}