Tôi có đoạn mã sau:Khi nào là DbConnection.StateChange được gọi?
class Program
{
static void Main()
{
var connection = new SqlConnection("myConnectionString");
connection.Open();
connection.StateChange += HandleSqlConnectionDrop;
Console.WriteLine("Hi");
Console.ReadLine();
}
private static void HandleSqlConnectionDrop(object connection, StateChangeEventArgs args)
{
Console.WriteLine("DB change detected");
}
}
tôi bắt đầu mã trên trong khi dụ SQL máy chủ đang chạy. Sau đó, tôi tiếp tục thực hiện
SHUTDOWN WITH NOWAIT;
trên cá thể máy chủ sql mà chương trình được kết nối. Sau đó tôi quan sát dịch vụ máy chủ SQL dừng lại. Tuy nhiên, tôi không bao giờ thấy thông báo "DB phát hiện thay đổi" trong đầu ra. Tại sao điều này?
Ngoài: Tôi sẽ thấy trình xử lý StateChange được gọi nếu sau đó tôi cố gắng thực hiện thao tác trên kết nối SQL, nhưng chưa bao giờ trước khi thực hiện. Có cách nào hành vi này có thể thay đổi không?
"Tôi sẽ thấy trình xử lý StateChange được gọi nếu sau đó tôi cố gắng thực hiện một thao tác trên kết nối SQL" - Trong thực tế, bạn trả lời câu hỏi của mình. Đối tượng kết nối không ping server và chỉ kiểm tra trạng thái khi cần. Đặt 'connection.Open()' sau '.StateChange + = ...' để thấy nó hoạt động. –
@AlexKudryashev Không nên có một số loại giữ sống giữa khách hàng SQL và máy chủ SQL? Sự hiểu biết của tôi là các đối tượng SqlConnection nên ánh xạ một phiên một với các phiên máy chủ SQL. Nếu máy chủ giết phiên, có cách nào để tôi có thể có thông tin đó được chuyển tới mã của tôi không? –
bạn có thể thử thăm dò máy chủ bằng thứ gì đó vô hại như 'select 1' –