SqlDependency dans une application ASP.NET (ADO.NET)
L'exemple de cette section montre comment utiliser SqlDependency indirectement en tirant parti de l'objet SqlCacheDependency ASP.NET. L'objet SqlCacheDependency utilise un objet SqlDependency pour écouter les notifications et mettre correctement à jour le cache.
Remarque |
---|
L'exemple de code est basé sur l'hypothèse que vous avez activé les notifications de requête en exécutant les scripts dans Activation des notifications de requête (ADO.NET). |
À propose 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. Lorsque la page se charge, le code écrit l'heure actuelle dans un contrôle Label. Ensuite, elle définit un objet SqlCacheDependency et les propriétés de l'objet Cache pour stocker les données du cache pendant trois minutes au maximum. Le code se connecte ensuite à la base de données et récupère les données. Une fois que la page est chargée et que l'application s'exécute, ASP.NET récupère les données dans le cache, ce que vous pouvez vérifier en notant que l'heure indiquée sur la page ne change pas. Si les données surveillées sont modifiées, ASP.NET invalide le cache et remplit de nouveau le contrôle GridView avec les données actualisées, ce qui met à 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 :
Créez un site Web ASP.NET.
Ajoutez un contrôle Label et un contrôle GridView à la page Default.aspx.
Ouvrez le module de classe de la page et ajoutez les directives suivantes :
Option Strict On Option Explicit On Imports System.Data.SqlClient using System.Data.SqlClient; using System.Web.Caching;
Ajoutez le code suivant dans l'événement Page_Load de la page :
Protected Sub Page_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Load Label1.Text = "Cache Refresh: " & _ Date.Now.ToLongTimeString() ' Create a dependency connection to the database SqlDependency.Start(GetConnectionString()) Using connection As New SqlConnection(GetConnectionString()) Using command As New SqlCommand(GetSQL(), connection) Dim dependency As 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. Dim numberOfMinutes As Integer = 3 Dim expires As Date = _ 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() End Using End Using End Sub
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(); } } }
Ajoutez deux méthodes d'assistance, GetConnectionString et GetSQL. La chaîne de connexion définie utilise une sécurité intégrée. Vous devez vérifier que le compte que vous utilisez dispose des autorisations de base de données nécessaires et que les notifications sont activées dans l'exemple de base de données, AdventureWorks. Pour plus d'informations, voir Special Considerations When Using Query Notifications.
Private Function GetConnectionString() As String ' To avoid storing the connection string in your code, ' you can retrive it from a configuration file. Return "Data Source=(local);Integrated Security=true;" & _ "Initial Catalog=AdventureWorks;" End Function Private Function GetSQL() As String 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;" End Function
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 sur le formulaire Web et l'actualise toutes les trois minutes en cas d'inactivité. En cas de modification de la base de données, le cache est immédiatement actualisé. Exécutez l'application à partir de Visual Studio, ce qui charge la page dans le navigateur. L'heure d'actualisation du cache affichée indique la dernière actualisation du cache. Attendez trois minutes, puis actualisez la page. Un événement de publication se produit alors. Notez que l'heure affichée sur la page a changé. Si vous actualisez la page avant trois minutes, l'heure affichée sur la page restera la même.
Mettez à jour les données dans la base de données en utilisant une commande Transact-SQL UPDATE, puis 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. Notez que même si le cache est mis à jour, l'heure affichée sur le page n'est pas modifiée tant qu'un événement de publication ne s'est pas produit.