Tôi đang làm việc với SQLDependency để thông báo cho tôi nếu có thay đổi trong Cơ sở dữ liệu. Sau khi chương trình khởi động nó hoạt động tốt. Khi tôi thực hiện thay đổi đầu tiên, sự kiện sẽ xảy ra. Wohoo ... thật tuyệt. Nhưng nếu tôi thực hiện thay đổi thứ hai, sự kiện sẽ không kích hoạt trở lại. Tôi đã tìm kiếm tất cả các trang web mà tôi nghĩ nhưng không tìm thấy bất cứ điều gì về vấn đề này. Chỉ tìm thấy sự cố khi sự kiện OnChange kích hoạt trong vòng lặp. Có ai giúp tôi không?SQLDependency_OnChange-Event chỉ kích hoạt một lần duy nhất
Dưới đây là một mã số ít mảnh:
private void GetStates()
{
if (!DoesUserHavePermission())
return;
SqlDependency.Stop(con);
SqlDependency.Start(con);
using (SqlConnection cn = new SqlConnection(con))
{
using (SqlCommand cmd = cn.CreateCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT Bla, Bla2, ..FROM dbo.[BLA3]"
cmd.Notification = null;
cmd.Dispose();
SqlDependency dep = new SqlDependency(cmd);
dep.OnChange += new OnChangeEventHandler(dep_OnChange);
cn.Open();
using (SqlDataReader dr = cmd.ExecuteReader())
{
state.Clear(); //In this Case "state" is a List<string>
while (dr.Read())
{
state.Add(dr.GetString(0) + "|" + dr.GetInt32(3));
}
dr.Dispose();
dr.Close();
}
}
}
}
tôi OnChange-tổ chức sự kiện trông như thế này:
private void dep_OnChange(object sender, SqlNotificationEventArgs e)
{
SqlDependency dep = sender as SqlDependency;
dep.OnChange -= this.dep_OnChange;
using (SqlConnection cn = new SqlConnection(con))
{
using (SqlCommand cmd = cn.CreateCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT Bla, Bla2, ..FROM dbo.[BLA3]";
cmd.Notification = null;
if (e.Type == SqlNotificationType.Change)
{
if (cn.State != ConnectionState.Open)
{
cn.Open();
}
using (SqlDataReader dr = cmd.ExecuteReader())
{
state.Clear(); // Clear and Refill the stringlist "state"
while (dr.Read())
{
state.Add(dr.GetString(0) + "|" + dr.GetInt32(3));
}
}
}
cn.Close();
}
}
this.GetStates(); //to go ahead and wait for a new change
}
đâu là vấn đề?
bạn phải khởi tạo lại SqlDependency sau lần gọi sự kiện lần đầu. do đó, nó sẽ không phá vỡ cho sự kiện thứ 2 và như vậy. nó sẽ hoạt động hoàn hảo. – adnan