Estoy trabajando con SQLDependency para notificarme si hay un cambio en la base de datos. Después de la puesta en marcha del programa, funciona bien. Cuando hago un primer cambio, el evento se dispara. Wohoo ... eso es genial. Pero si hice un segundo cambio, el evento no se dispara nuevamente. He buscado en toda la web, creo, pero no he encontrado nada sobre ESTE problema. Solo se encontraron problemas en los que OnChange-Event se activa en un bucle. ¿Alguien puede ayudarme?SQLDependency_OnChange-Event activa solo una vez Tiempo
Aquí una pequeña pieza de código:
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();
}
}
}
}
mi AlCambiar-Evento se ve así:
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
}
¿Dónde está el problema?
tiene que iniciar SqlDependency nuevamente después de la llamada al evento por primera vez. por lo que no se romperá para el segundo evento y así sucesivamente. funcionará perfectamente – adnan