更新2 我建议滚动你自己的超时。事情是这样的:
internal static class Program
{
private static void Main(string[] args)
{
Console.WriteLine(SqlServerIsRunning("Server=foobar; Database=tempdb; Integrated Security=true", 5));
Console.WriteLine(SqlServerIsRunning("Server=localhost; Database=tempdb; Integrated Security=true", 5));
}
private static bool SqlServerIsRunning(string baseConnectionString, int timeoutInSeconds)
{
bool result;
using (SqlConnection sqlConnection = new SqlConnection(baseConnectionString + ";Connection Timeout=" + timeoutInSeconds))
{
Thread thread = new Thread(TryOpen);
ManualResetEvent manualResetEvent = new ManualResetEvent(false);
thread.Start(new Tuple<SqlConnection, ManualResetEvent>(sqlConnection, manualResetEvent));
result = manualResetEvent.WaitOne(timeoutInSeconds*1000);
if (!result)
{
thread.Abort();
}
sqlConnection.Close();
}
return result;
}
private static void TryOpen(object input)
{
Tuple<SqlConnection, ManualResetEvent> parameters = (Tuple<SqlConnection, ManualResetEvent>)input;
try
{
parameters.Item1.Open();
parameters.Item1.Close();
parameters.Item2.Set();
}
catch
{
// Eat any exception, we're not interested in it
}
}
}
更新1
我已经使用这个代码只是测试这是我自己的电脑上:
internal static class Program
{
private static void Main(string[] args)
{
SqlConnection con = new SqlConnection("Server=localhost; Database=tempdb; Integrated Security=true;Connection Timeout=5");
Console.WriteLine("Attempting to open connection with {0} second timeout, starting at {1}.", con.ConnectionTimeout, DateTime.Now.ToLongTimeString());
try
{
con.Open();
Console.WriteLine("Successfully opened connection at {0}.", DateTime.Now.ToLongTimeString());
}
catch (SqlException)
{
Console.WriteLine("SqlException raised at {0}.", DateTime.Now.ToLongTimeString());
}
}
}
,并服从连接字符串中的Connection Timeout
值。这是针对SQL Server 2008 R2的.NET 4。无可否认,这是一个本地主机连接,可能会给出不同的结果,但这意味着我无法复制该问题。
我只能建议尝试在您的网络环境中类似的代码块,看看你是否继续看到长时间的超时。
老(不正确)的答案 我错误地以为ConnectionTimeout
财产是可设置的,但事实并非如此。
尝试设置SqlConnection.ConnectionTimeout而不是使用连接字符串。
ConnectionTimeout是一个只读属性 – BlueMonkMN 2010-09-01 16:20:58
我在这里打一个非常奇怪的图案。当我连接到SQL Server停止的本地系统时,超时似乎正常工作。当我尝试连接到一个不存在的服务器时它似乎工作。但是,当我尝试连接到存在的服务器,但防火墙阻止SQL和/或没有安装SQL Server时,它似乎不起作用。 – BlueMonkMN 2010-09-01 16:54:23
关于这个问题的一个有趣的线程在这里:http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework.adonet/topic48533.aspx。我建议实现你自己的超时机制 - 分离一个线程来尝试打开并杀死它,如果它没有在你想要的超时期限内成功。 – 2010-09-01 17:08:37