Pracuję z SQLDependency, aby powiadomić mnie, jeśli nastąpiła zmiana w bazie danych. Po uruchomieniu programu działa dobrze. Kiedy dokonam pierwszej zmiany, Zdarzenie zostanie wywołane. Wohoo ... to świetnie. Ale jeśli dokonałem drugiej zmiany, zdarzenie nie zostanie ponownie uruchomione. Przeszukałem całą sieć, ale myślę, że nie znalazłem nic na temat tego problemu. Występują tylko problemy związane z uruchomieniem zdarzenia OnChange-Event w pętli. Czy ktoś może mi pomóc?SQLDependency_OnChange-Event uruchamia tylko jeden czas.
Oto mały kawałek kodu:
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();
}
}
}
}
mój OnChange-Event wygląda następująco:
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
}
Gdzie jest problem?
musisz ponownie zainicjować SqlDependency po pierwszym zdarzeniu. więc nie zostanie przerwane na drugie wydarzenie i tak dalej. to zadziała idealnie. – adnan