2017-09-26 4 views
0

Ich versuche SqlDepenency zum ersten Mal. Ich bekomme keine Benachrichtigungen über das Datenbank-Update.SqlDependency nicht feuern

Ich Platzierung Stützpunkte innen: OnChange(object sender, SqlNotificationEventArgs e),

aber es wird nie getroffen.

Hier ist mein Code:

protected void Page_Load(object sender, EventArgs e) 
    { 

     Label1.Text = "Cache Refresh: " + DateTime.Now.ToLongTimeString(); 
     DateTime.Now.ToLongTimeString(); 
     // Create a dependency connection to the database. 
     SqlDependency.Start(GetConnectionString()); 

     using (SqlConnection connection = new SqlConnection(GetConnectionString())) 
     { 
      using (SqlCommand command = new SqlCommand(GetSQL(), connection)) 
      { 

       SqlDependency dependency = 
         new SqlDependency(command); 

        // Refresh the cache after the number of minutes 
        // listed below if a change does not occur. 
        // This value could be stored in a configuration file. 
            connection.Open(); 

       dgHomeRequests.DataSource = command.ExecuteReader(); 
        dgHomeRequests.DataBind(); 

      } 
     } 
    } 


    private string GetConnectionString() 
    { 
     // To avoid storing the connection string in your code, 
     // you can retrieve it from a configuration file. 
     //return "Data Source=(local);Integrated Security=true;" +"Initial Catalog=AdventureWorks;"; 
     return ConfigurationManager.ConnectionStrings["TestData"].ConnectionString; 
    } 
    private string GetSQL() 
    { 
     return "Select [Address] From [UserAccount1]"; 
    } 


    void OnChange(object sender, SqlNotificationEventArgs e) 
    { 
     // have breakpoint here: 
     SqlDependency dependency = sender as SqlDependency; 

     // Notices are only a one shot deal 
     // so remove the existing one so a new 
     // one can be added 

     dependency.OnChange -= OnChange; 

     // Fire the event 
     /* if (OnNewMessage != null) 
     { 
      OnNewMessage(); 
     }*/ 
    } 

ich auch einige Code in Global.asax-Datei abgelegt haben:

public class Global : HttpApplication 
{ 
    void Application_Start(object sender, EventArgs e) 
    { 
     // Code that runs on application startup 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
     SqlDependency.Start(ConfigurationManager.ConnectionStrings["TestData"].ConnectionString); 
    } 
    protected void Application_End() 
    { 
     // Shut down SignalR Dependencies 
     SqlDependency.Stop(ConfigurationManager.ConnectionStrings["TestData"].ConnectionString); 
    } 
} 

Der SQL-Server auf dem lokalen Rechner ist. Ich führe den Code über Visual Studio (IIS Express).

ALTER DATABASE SET ENABLE_BROKER GO

  • Zur Abfrage Benachrichtigung abonnieren, müssen wir die Erlaubnis, IIS-Dienstkonto

    GRANT SUBSCRIBE QUERY NOTIFICATIONS TO “<serviceAccount>” 
    
  • :

    1. Zum Service-Broker auf Datenbank aktivieren

      Ich vermutete der 2. Punkt wird nicht benötigt, wie ich Es ist lokal. Aber ich habe versucht, ihm einige Berechtigungen zu geben. Ich weiß nicht, ob sie richtig sind, da ich nicht glaube, dass es App-Pool verwendet. Und brauchen nicht die Erlaubnis für lokale Umgebung. wenn ich selbst der Benutzer bin und das Schema selbst erstellt habe.

      Eine der Fragen, die ich sah die Gewährung wurde:

      alter authorization on database::<dbName> to [sa]; 
      

      Ich gab zu, dass die Erlaubnis.

    +0

    abfeuern kann Können Sie zwei Dinge überprüfen: 1), dass die Benachrichtigung 'einrichten' , siehe ['sys.dm_qn_subscriptions'] (https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/query-notifications-sys-dm-qn-subscriptions) und 2) die Benachrichtigungsmeldungen werden nicht in ['sys.transmission_queue'] (https://docs.microsoft.com/en-us/sql/relational -databases/system-catalog-ansichten/sys-transmission-queue-transact-sql) –

    +0

    @RemusRusanu Ich ging zu Ansichten, ausgewählte Top 1000 Zeilen für 'sys.dm_qn_subscriptions' und' sys.transmission_queue'. Sie waren beide da und sie waren beide leer. Irgendwelche Anomalie? –

    +0

    In 'sys.qn_subscriptions' sollte eine Zeile stehen. Ich vermute, dass Ihre Abfragebenachrichtigung sofort ungültig wird, weil sie gegen eine der hier aufgeführten Einschränkungen verstößt (https://technet.microsoft.com/en-us/library/ms181122 (v = sql.105) .aspx). Sie können eine grundlegende 'SqlDependency' anstelle von' SqlCacheDependency' verwenden und sehen, welche 'Info',' Source' und 'Type' Werte Sie in der [' SqlNotificationEventArgs'] (https://msdn.microsoft.com/de- us/library/system.data.sqlclient.sqlnotificationeventargs (v = vs.110) .aspx) –

    Antwort

    0

    mir fehlte: dependency.OnChange += new OnChangeEventHandler(OnChange); Der neue Code würde wie folgt aussehen:

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

    jetzt ich void OnChange(object sender, SqlNotificationEventArgs e)