SqlDependency dans une application ASP.NET

Télécharger ADO.NET

L’exemple de cette section montre comment utiliser SqlDependency indirectement à l’aide de l’objet ASP.NET SqlCacheDependency. L’objet SqlCacheDependency utilise une SqlDependency pour écouter les notifications et mettre correctement à jour le cache.

Notes

L'exemple de code est basé sur l'hypothèse que vous avez activé les notifications de requêtes en exécutant les scripts dans Activation des notifications de requêtes.

À propos de l’exemple d’application

L’exemple d’application utilise une page web ASP.NET unique pour afficher les références des produits extraites de la base de données SQL Server AdventureWorks dans un contrôle GridView. Lors du chargement de la page, le code écrit l’heure actuelle dans un contrôle Label. Il définit ensuite un objet SqlCacheDependency puis des propriétés sur l’objet Cache pour stocker les données du cache pendant trois minutes maximum. Le code se connecte ensuite à la base de données et récupère les données. Quand la page est chargée et que l’application est en cours d’exécution, ASP.NET récupère les données du cache, dont l’heure affichée dans la page n’a pas changé. Si les données supervisées changent, ASP.NET invalide le cache et remplit à nouveau le contrôle GridView avec les données actualisées, en mettant à jour l’heure affichée dans le contrôle Label.

Création de l’exemple d’application

Procédez comme suit pour créer et exécuter l’exemple d’application :

  1. Créez un site web ASP.NET.

  2. Ajoutez un Label et un contrôle GridView à la page Default.aspx.

  3. Ouvrez le module de classe de la page et ajoutez les directives suivantes :

    using Microsoft.Data.SqlClient;
    using System.Web.Caching;
    
  4. Ajoutez le code suivant dans l’événement Page_Load de la page :

    // using Microsoft.Data.SqlClient;
    protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = "Cache Refresh: " +
        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))
            {
                SqlCacheDependency dependency =
                    new SqlCacheDependency(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.
                int numberOfMinutes = 3;
                DateTime expires =
                    DateTime.Now.AddMinutes(numberOfMinutes);
    
                Response.Cache.SetExpires(expires);
                Response.Cache.SetCacheability(HttpCacheability.Public);
                Response.Cache.SetValidUntilExpires(true);
    
                Response.AddCacheDependency(dependency);
    
                connection.Open();
    
                GridView1.DataSource = command.ExecuteReader();
                GridView1.DataBind();
            }
        }
    }
    
  5. Ajoutez deux méthodes d'assistance, GetConnectionString et GetSQL. La chaîne de connexion définie utilise une sécurité intégrée. Vérifiez que le compte que vous utilisez a les autorisations de base de données nécessaires et que l’exemple de base de données AdventureWorks a les notifications activées.

    // using Microsoft.Data.SqlClient;
    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;";
    }
    private string GetSQL()
    {
        return "SELECT Production.Product.ProductID, " +
        "Production.Product.Name, " +
        "Production.Location.Name AS Location, " +
        "Production.ProductInventory.Quantity " +
        "FROM Production.Product INNER JOIN " +
        "Production.ProductInventory " +
        "ON Production.Product.ProductID = " +
        "Production.ProductInventory.ProductID " +
        "INNER JOIN Production.Location " +
        "ON Production.ProductInventory.LocationID = " +
        "Production.Location.LocationID " +
        "WHERE ( Production.ProductInventory.Quantity <= 100 ) " +
        "ORDER BY Production.ProductInventory.Quantity, " +
        "Production.Product.Name;";
    }
    

Test de l’application

L’application met en cache les données affichées dans le formulaire web et les actualise toutes les trois minutes en l’absence d’activité. Si une modification est apportée à la base de données, le cache est actualisé immédiatement. Exécutez l’application à partir de Visual Studio, qui charge la page dans le navigateur. L’heure d’actualisation du cache affichée indique à quel moment le cache a été actualisé pour la dernière fois. Attendez trois minutes, puis actualisez la page, provoquant ainsi l’exécution d’un événement de publication (postback). L’heure affichée dans la page a changé. Si vous actualisez la page en moins de trois minutes, l’heure affichée sur la page reste la même.

Mettez à jour les données dans la base de données en utilisant une commande Transact-SQL UPDATE et actualisez la page. L’heure affichée indique maintenant que le cache a été actualisé avec les nouvelles données de la base de données. Même si le cache est mis à jour, l’heure affichée dans la page ne change pas tant qu’un événement de publication (postback) ne se produit pas.

Étapes suivantes