Sto lavorando con SQLDependency per notificarmi se c'è una modifica nel Database. Dopo l'avvio del programma funziona perfettamente. Quando faccio un primo cambio, l'evento si accende. Wohoo ... è fantastico. Ma se ho fatto una seconda modifica, l'evento non si attiva di nuovo. Ho cercato tutto il web, ma non ho trovato nulla su questo problema. Trovato solo problemi in cui l'evento OnChange si attiva in un loop. Qualcuno può aiutarmi?SQLDependency_OnChange-Event scatta solo una volta.
Ecco un piccolo pezzo di codice:
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();
}
}
}
}
mia OnChange-evento è simile al seguente:
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
}
Dov'è il problema?
è necessario avviare nuovamente SqlDependency dopo la chiamata di evento 1a volta. quindi non si romperà per il 2 ° evento e così via. funzionerà perfettamente. – adnan