Cập nhật 2 Tôi khuyên bạn nên hết thời gian chờ của riêng mình. Một cái gì đó như thế này:
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
}
}
}
Cập nhật 1
Tôi vừa thử nghiệm này trên máy tính của riêng tôi sử dụng mã này:
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());
}
}
}
và nó tuân theo các giá trị Connection Timeout
trong chuỗi kết nối . Điều này là với .NET 4 so với SQL Server 2008 R2. Phải thừa nhận rằng, đó là một kết nối localhost mà có thể cho kết quả khác nhau nhưng nó có nghĩa là tôi không thể tái tạo vấn đề.
Tôi chỉ có thể đề xuất thử một đoạn mã tương tự trong môi trường mạng của bạn và xem liệu bạn có tiếp tục thấy thời gian chờ lâu hay không.
Câu trả lời cũ (không chính xác) Tôi đã nghĩ không chính xác thuộc tính ConnectionTimeout
đã được đặt, nhưng không phải.
Thử đặt SqlConnection.ConnectionTimeout thay vì sử dụng chuỗi kết nối.
Nguồn
2010-09-01 14:54:07
ConnectionTimeout là một tài sản chỉ đọc – BlueMonkMN
Tôi đang đánh một mẫu rất kỳ lạ ở đây. Thời gian chờ dường như hoạt động khi tôi kết nối với hệ thống cục bộ của mình với SQL Server đã dừng. Dường như nó hoạt động khi tôi cố gắng kết nối với một máy chủ không tồn tại. Nhưng nó dường như không hoạt động khi tôi cố gắng kết nối với một máy chủ tồn tại, nhưng có tường lửa chặn SQL và/hoặc không có SQL Server được cài đặt. – BlueMonkMN
Một chủ đề thú vị về vấn đề này ở đây: http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework.adonet/topic48533.aspx. Tôi khuyên bạn nên triển khai cơ chế thời gian chờ của riêng mình - quay vòng một chuỗi để thử mở và giết nó nếu nó không thành công trong khoảng thời gian chờ bạn muốn. –