2016-08-05 2 views
2

Kann mir Körper sagen, was ist der Grund hinter SQL Abhängigkeit OnChange Ereignisaufrufe mehrere Male nach Seitenaktualisierung. Was könnte der mögliche Grund dafür sein? Vor der Seitenaktualisierung wird nur einmal pro Änderung in der Datenbank aufgerufen.SQL Abhängigkeit OnChange Ereignisaufrufe mehrere Male auf Seite Aktualisierungsgrund

+0

Prüfen Sie HasChanges? – Botonomous

+0

Wenn es eine Änderung in der Datenbank gibt, wird das OnChange-Ereignis der Abhängigkeit ausgelöst, aber dieses Ereignis wird mehrere Male nach der Seitenaktualisierung ausgelöst, wenn wir eine Änderung in der Datenbank – usman

+0

@usman hi usman haben. Haben Sie eine Lösung für dieses Problem gefunden? Ich habe genau dasselbe Problem. Können Sie mir helfen? – mayk

Antwort

5

Problem: Wenn ich Seite jedes Mal, wenn ein neues SQL Dependency Variable erstellt wurde und auch einen neuen Change_Event_Handler mit diesem neuen Abhängigkeits Variablen verbunden zu aktualisieren, und wenn SQL Abhängigkeit dann aufgerufen wird, hat es von all bestehenden Change abmelden Ereignisse, die mehrere Aufrufe an meine Funktion gemacht haben.

Lösung: Definieren Sie diese beiden Variablen als statisch in der Klasse:

internal static SqlCommand command = null; 
    internal static SqlDependency dependency = null; 

Dann die Funktion wie diese, und in Anwendung starten zuerst die Abhängigkeit stoppen und dann wieder von vorn anfangen und dann wie diese anderen Sachen zu tun . Überprüfen Sie, ob die Abhängigkeit bereits gestartet wird, dann keine neue Abhängigkeit Verbindung erstellen und in ähnlicher Weise neue Change,

using (EmailController.command = new SqlCommand(SQL.emailmessagesbyaccount_sql(), conn.getDbConnection())) 
    { 
     defaultemailid = emailid; 
     EmailController.command.Parameters.Add(new SqlParameter("@emailaccountid", emailid)); 

     EmailController.command.Notification = null; 

     if (EmailController.dependency == null) 
     { 
      EmailController.dependency = new SqlDependency(EmailController.command); 
      EmailController.dependency.OnChange += new OnChangeEventHandler(emailMessages_OnChange); 
     } 
     var reader = EmailController.command.ExecuteReader(); 
    } 

und schließlich haben Sie die onchange_event wie folgt umzusetzen:

private void emailMessages_OnChange(object sender, SqlNotificationEventArgs e) 
{ 
    if (e.Type == SqlNotificationType.Change) 
    { 
     //if not null then unsubscribe the calling event 
     if (EmailController.dependency != null) 
     { 
      EmailController.dependency.OnChange -= emailMessages_OnChange; 
     } 
     //do my email updates 
     NotificationHub.EmailUpdateRecords(); 


     // here again subscribe for the new event call re initialize the 
     // exising dependecy variable the one which we defined as static 

     SingletonDbConnect conn = SingletonDbConnect.getDbInstance(); 
     using (EmailController.command = new SqlCommand(SQL.emailmessagesbyaccount_sql(), conn.getDbConnection())) 
     { 
      EmailController.command.Parameters.Add(new SqlParameter("@emailaccountid", defaultemailid)); 
      EmailController.command.Notification = null; 

      EmailController.dependency = new SqlDependency(EmailController.command); 
      EmailController.dependency.OnChange += new OnChangeEventHandler(emailMessages_OnChange); 

      var reader = EmailController.command.ExecuteReader(); 

     } 

    } 
} 

Eigentlich war dies mein Code Logik, aber hoffe, Sie werden ziemlich gute Idee von dieser Implementierung bekommen, wie man mit dieser Art von Problem, das mich für eine Woche den Kopf stolpern ließ.

+0

Vielen Dank für diese Lösung. Ich habe so etwas gemacht. – mayk

+0

:) froh, dir zu helfen – usman

+1

danke, es funktioniert mich, ich fühle mich jetzt einfach. – adnan

1

Ich hatte das gleiche Problem und @ usmans Antwort hat mir sehr geholfen. Ich ändere die Logik der dependency_OnChange-Methode ein wenig.

 private void dependency_OnChange(object sender, SqlNotificationEventArgs e) 
     { 
      if (dependency != null) 
      { 
       dependency.OnChange -= dependency_OnChange; 
       dependency = null; 
      } 
      if (e.Type == SqlNotificationType.Change) 
      { 
       MessagesHub.SendMessages(); 
      } 
     } 

Ich setze die Abhängigkeit auf null, wenn es nicht null ist. Wenn wir es nicht auf null setzen, wird es ausgelöst, bei jeder Seitenaktualisierung und wenn die Seite mehrmals geöffnet oder von mehreren Browsern geöffnet wird. @usman hat die Abhängigkeit als internes Static definiert und die Abhängigkeit in der onChange-Methode auf null gesetzt. Das hat meinen Tag gemacht. Ich hoffe, es hilft anderen, die das gleiche Problem haben.

Verwandte Themen