2017-09-26 4 views
0

J'essaye SqlDepenedency pour la première fois. Je ne reçois aucune notification sur la mise à jour de la base de données.SqlDependency ne se déclenche pas

Je place: à l'intérieur des points d'arrêt OnChange(object sender, SqlNotificationEventArgs e),

mais il ne se fait frapper.

Voici mon 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(); 
     }*/ 
    } 

J'ai aussi placé un code dans le fichier Global.asax:

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); 
    } 
} 

Le serveur SQL est sur la machine locale. Je cours le code par l'intermédiaire de Visual Studio (IIS Express).

  1. Pour activer le courtier de services sur la base de données:

    ALTER DATABASE SET ENABLE_BROKER GO

  2. Pour vous abonner notification de requête, nous devons donner la permission au compte de service IIS

    GRANT SUBSCRIBE QUERY NOTIFICATIONS TO “<serviceAccount>” 
    

J'ai deviné le 2ème point n'est pas nécessaire car je t est local. Mais j'ai essayé de lui donner quelques permissions. Je ne sais pas si ils ont raison car je ne pense pas qu'il utilise l'application pool.And n'ont pas besoin de l'autorisation sur env local. si je suis l'utilisateur moi-même et que j'ai créé le schéma moi-même.

L'une des questions que je voyais octroyait:

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

je lui ai donné cette autorisation aussi.

+0

Pouvez-vous vérifier deux choses: 1) que la notification est 'mise en place' , voir ['sys.dm_qn_subscriptions'] (https://docs.microsoft.com/fr-fr/sql/relational-databases/system-dynamic-management-views/query-notifications-sys-dm-qn-subscriptions) et 2) les messages de notification ne sont pas conservés dans ['sys.transmission_queue'] (https://docs.microsoft.com/en-us/sql/relational -databases/system-catalog-views/sys-transmission-file-transact-sql) –

+0

@RemusRusanu Je suis allé aux vues, sélectionné 1000 premières lignes pour 'sys.dm_qn_subscriptions' et' sys.transmission_queue'. Ils étaient tous les deux là et tous les deux étaient vides. Toute anomalie? –

+0

Il devrait y avoir une ligne dans 'sys.qn_subscriptions'. Je soupçonne que votre notification de requête est immédiatement invalidée car elle enfreint l'une des restrictions répertoriées [ici] (https://technet.microsoft.com/en-us/library/ms181122 (v = sql.105) .aspx). Vous pouvez utiliser un 'SqlDependency' de base au lieu de' SqlCacheDependency' et indiquez quelles valeurs 'Info',' Source' et 'Type' vous obtenez dans [' SqlNotificationEventArgs'] (https://msdn.microsoft.com/fr us/library/system.data.sqlclient.sqlnotificationeventargs (v = vs.110) .aspx) –

Répondre

0

je manquais: dependency.OnChange += new OnChangeEventHandler(OnChange); Le nouveau code ressemblerait à ceci:

   SqlDependency dependency = new SqlDependency(command); 

       dependency.OnChange += new OnChangeEventHandler(OnChange); 

maintenant je peux tirer void OnChange(object sender, SqlNotificationEventArgs e)