2010-08-23 4 views
3

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(); 
} 
+2

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). –

Répondre

11

Vérifiez votre base de données sys.transmission_queue. Vos notifications seront probablement conservées, car elles ne peuvent pas être livrées. Le transmission_status aura une explication pourquoi est-ce que cela se produit. Pour un guide de dépannage plus détaillé, voir Troubleshooting Dialogs.

Le plus souvent question est due à EXECUTE AS besoins d'infrastructure ne sont pas satisfaits par une propriété de dbo de base de données devenus orphelins et peuvent être résolus via:

ALTER AUTHORIZATION ON DATABASE::<dbname> TO [sa]; 

mais la solution dépend d'un cas à l'autre, en fonction de la réelle problème, comme étudié ci-dessus.

+0

Pouvez-vous regarder ma question. Je ne sais pas pourquoi cela ne fonctionne pas: https://stackoverflow.com/questions/46434652/sqldependency-not-firing –

Questions connexes