Freigeben über


SqlDependency in einer ASP.NET-Anwendung

ADO.NET herunterladen

Das Beispiel in diesem Abschnitt zeigt, wie SqlDependency durch die Nutzung des SqlCacheDependency-Objekts von ASP.NET indirekt verwendet werden kann. Das SqlCacheDependency-Objekt verwendet ein SqlDependency, um auf Benachrichtigungen zu lauschen und den Cache ordnungsgemäß zu aktualisieren.

Hinweis

Im Beispielcode wird davon ausgegangen, dass Sie Abfragebenachrichtigungen durch Ausführen der Skripts in Aktivieren von Abfragebenachrichtigungen aktiviert haben.

Infos zur Beispielanwendung

In der Beispielanwendung wird eine einzelne ASP.NET-Webseite verwendet, um Produktinformationen aus der SQL Server-AdventureWorks-Datenbank in einem GridView-Steuerelement anzuzeigen. Wenn die Seite geladen wird, schreibt der Code die aktuelle Uhrzeit in ein Label-Steuerelement. Anschließend wird ein SqlCacheDependency-Objekt definiert, und es werden Eigenschaften für das Cache-Objekt festgelegt, um die Cachedaten bis zu drei Minuten zu speichern. Der Code stellt dann eine Verbindung mit der Datenbank her und ruft die Daten ab. Wenn die Seite geladen wurde und die Anwendung ausgeführt wird, ruft ASP.NET Daten aus dem Cache ab, was Sie bestätigen können, weil sich die Zeit auf der Seite nicht ändert. Wenn sich die überwachten Daten ändern, macht ASP.NET den Cache ungültig und füllt das GridView-Steuerelement erneut mit aktuellen Daten auf, wobei die im Label-Steuerelement angezeigte Uhrzeit aktualisiert wird.

Erstellen der Beispielanwendung

Befolgen Sie diese Anweisungen, um die Beispielanwendung zu erstellen und auszuführen:

  1. Erstellen Sie eine neue ASP.NET-Website.

  2. Fügen Sie der Seite „Default.aspx“ die Steuerelemente Label und GridView hinzu.

  3. Öffnen Sie das Klassenmodul der Seite, und fügen Sie die folgenden Anweisungen hinzu:

    using Microsoft.Data.SqlClient;
    using System.Web.Caching;
    
  4. Fügen Sie den folgenden Code in das Ereignis Page_Load der Seite ein:

    // 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. Fügen Sie die beiden Hilfsmethoden GetConnectionString und GetSQL hinzu. Die definierte Verbindungszeichenfolge verwendet die integrierte Sicherheit. Vergewissern Sie sich, dass das verwendete Konto über die erforderlichen Datenbankberechtigungen verfügt und für die Beispieldatenbank AdventureWorks Benachrichtigungen aktiviert sind.

    // 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;";
    }
    

Testen der Anwendung

Die Anwendung speichert die auf dem Webformular angezeigten Daten im Cache und aktualisiert sie alle drei Minuten, sofern keine Aktivität stattfindet. Wenn eine Änderung an der Datenbank vorgenommen wird, wird der Cache sofort aktualisiert. Führen Sie die Anwendung in Visual Studio aus, wodurch die Seite in den Browser geladen wird. Die gezeigte Aktualisierungszeit des Caches gibt an, wann der Cache zuletzt aktualisiert wurde. Warten Sie drei Minuten, und laden Sie dann die Seite neu, wodurch ein Postback-Ereignis ausgelöst wird. Die auf der Seite angezeigte Zeit hat sich geändert. Wenn Sie die Seite in weniger als drei Minuten aktualisieren, bleibt die auf der Seite gezeigte Zeit gleich.

Aktualisieren Sie nun mit dem Transact-SQL-Befehl UPDATE die Daten in der Datenbank und anschließend die Seite. Die jetzt angezeigte Zeit bedeutet, dass der Cache mit den neuen Daten aus der Datenbank aktualisiert wurde. Obwohl der Cache aktualisiert wurde, ändert sich die auf der Seite angezeigte Zeit erst, wenn ein Postback-Ereignis eintritt.

Nächste Schritte