J'ai une base de données fonctionnant sous MS SQL Server 2005 et une application Web ASP.NET 3.5.Pourquoi mon SqlDependency ne se déclenche-t-il pas
La base de données contient un catalogue de produits que j'utilise pour alimenter des "pages" dans un CMS fonctionnant dans l'application web. Une fois les pages créées, l'application les met en cache. Je dois donc notifier l'application de cette modification afin qu'elle puisse recréer les objets de la page.
Le CMS utilise sa propre mise en cache, de sorte qu'une dépendance SqlCacheD ne peut pas être utilisée pour effectuer cette tâche.
Quand je lance l'application jusqu'à je reçois un abonné apparaissant dans le résultat de
select * from sys.dm_qn_subscriptions
Mais dès que j'ajouter des données à la table, l'abonné disparaît et l'événement OnChanged ne déclenche.
Dans mon code de démarrage, je donne les résultats suivants
// Ensure the database is setup for notifications
SqlCacheDependencyAdmin.EnableNotifications(DataHelper.ConnectionString);
SqlCacheDependencyAdmin.EnableTableForNotifications(DataHelper.ConnectionString, "Category");
SqlCacheDependencyAdmin.EnableTableForNotifications(DataHelper.ConnectionString, "Product");
if (!SqlDependency.Start(DataHelper.ConnectionString, SqlDependencyQueueName))
throw new Exception("Something went wrong");
string queueOptions = string.Format("service = {0}", SqlDependencyQueueName);
using (var connection = new SqlConnection(DataHelper.ConnectionString))
{
connection.Open();
using (SqlCommand command = new SqlCommand(@"SELECT [CategoryID],[Name]
FROM [dbo].[Category]", connection))
{
// Create a dependency and associate it with the SqlCommand.
dependency = new SqlDependency(command, queueOptions, 0);
// Subscribe to the SqlDependency event.
dependency.OnChange += new OnChangeEventHandler(OnDependencyChange);
command.ExecuteReader().Close();
}
}
// ...
void OnDependencyChange(object sender, SqlNotificationEventArgs e)
{
Debugger.Break(); // This never hits
this.ReloadData();
}
btw, vous devriez toujours inspecter les membres SqlNotificationEventArg avant de recharger les données. Sinon, vous courez le risque de déployer en production une boucle serrée qui se recharge sur chaque mauvaise déclaration ou augmente la notification des paramètres. Et il vaut mieux simplement invalider le cache et laisser l'accès suivant charger les données, plutôt que de recharger proactivement sur notification (pour les mêmes raisons d'éviter une mauvaise situation où il boucle fortement). –