2009-12-15 3 views
4

Je voudrais utiliser les notifications SQL Server pour capturer les événements d'insertion dans ma base de données dans une application WinForms. J'essaie d'utiliser l'objet SQLDependency. Les articles MSDN font que cela semble assez simple. J'ai donc créé un petit exemple d'application pour essayer. L'événement ne semble déclencher que lorsque j'entre dans mon application la première fois (MessageBox apparaît). L'insertion de données dans la table n'augmente pas l'événement OnChange. Quelqu'un peut-il me dire ce que je manque? Merci!Notifications SQL Server - Mon OnChange ne se déclenche pas

public Main() 
    { 
     InitializeComponent(); 
     var check = EnoughPermission(); 
     SqlDependency.Stop(constr); 
     SqlDependency.Start(constr); 
     if(connection == null) 
     { 
      connection = new SqlConnection(constr); 
     } 
     if(command == null) 
     { 
      command = new SqlCommand("Select ID, ChatMessage FROM dbo.Chat",connection); 
     } 
     connection.Open(); 
     command.Notification = null; 
     SqlDependency dependency = new SqlDependency(command); 
     dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); 
     command.ExecuteReader(); 
    } 





    private void dependency_OnChange(object sender, SqlNotificationEventArgs e) 
    { 
     MessageBox.Show("Change!"); 
    } 
+0

Où insérez-vous des données? Une instruction SELECT n'est pas un INSERT. –

+0

J'insère les données dans un analyseur de requête. Bon appel sur l'INSERT n'étant pas un SELECT :) La sélection est nécessaire pour indiquer à la base de données les données que vous regardez pour les notifications. – Nick

+0

Notez que je passe ce SELECT à l'objet SqlDendency .. – Nick

Répondre

6

Votre première notification est la seule notification que vous recevrez. Les notifications de requête ne sont pas un abonnement pour les modifications, une fois qu'une notification est envoyée, elle est également invalidée. Vous êtes censé soumettre à nouveau un nouvel abonnement de notification.

Si votre requête est notifiée immedeatly cela signifie que vous n'avez pas reçu une notification pour un changement, mais pour une requête non valide. Vérifiez les valeurs de l'argument SqlNotificationEventArgs que vous recevez. Cochez la case Info pour insérer/mettre à jour/supprimer, cochez les cases Source pour les données, cochez la case Type pour modifier.

Jetez un oeil à l'Watcher Application exemple pour mieux comprendre comment vous êtes censé réabonner quand il est avisé. Pour une meilleure compréhension du fonctionnement des notifications de requête, voir The Mysterious Notification.

+0

Donc, ma sélection n'est pas valide? La propriété info a 'invalide'. Merci Ill jeter un oeil à ces liens que vous avez envoyés! – Nick

+0

Le SELECt en soi me semble valable, mais il y a environ un plus de critères mirriad. Voir http://msdn.microsoft.com/en-us/library/ms181122(SQL.90).aspx –

11

Pendant que je travaillais dans la mise en œuvre de la notification de la requête, je suis le problème exact. J'ai vérifié toutes les configurations, pièces de code, et même les paramètres TCP, mais rien n'a aidé. Ensuite, j'ai trouvé la requête suivante à exécuter sur la base de données et cela a résolu mon problème. Peut-être que vous pouvez l'essayer.

ALTER AUTHORIZATION ON DATABASE::[Your DB] TO sa; 
+0

Merci beaucoup, bon monsieur, cela a vraiment résolu mon problème. –

+3

A travaillé pour moi aussi. Mais je voudrais comprendre ce qui a été fait par cette requête. – bussa

+0

'Le nouveau propriétaire de la base de données proposé est déjà un utilisateur ou un alias dans la base de données.» –

Questions connexes