"SqlDependency" in einer ASP.NET-Anwendung

Das Beispiel in diesem Abschnitt zeigt, wie SqlDependency durch die Nutzung des ASP.NET SqlCacheDependency-Objekts 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.

Die 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 ist und die Anwendung ausgeführt wird, ruft ASP.NET Daten aus dem Cache ab, was Sie bestätigen können, indem Sie feststellen, dass 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:

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

    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();
            }
        }
    }
    
    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
    
  5. Fügen Sie die beiden Hilfsmethoden GetConnectionString und GetSQL hinzu. Die definierte Verbindungszeichenfolge verwendet die integrierte Sicherheit. Sie müssen sicherstellen, dass das verwendete Konto über die erforderlichen Datenbankberechtigungen verfügt und dass für die Beispieldatenbank AdventureWorks Benachrichtigungen aktiviert sind.

    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;";
    }
    
    Private Function GetConnectionString() As String
        ' 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;"
    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
    

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. Beachten Sie, dass sich die auf der Seite gezeigte Zeit geändert hat. 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 gezeigte Zeit bedeutet, dass der Cache mit den neuen Daten aus der Datenbank aktualisiert wurde. Beachten Sie, dass, obwohl der Cache aktualisiert wurde, die auf der Seite gezeigte Zeit sich solange nicht ändert, bis ein Postback-Ereignis eintritt.

Verteilte Cachesynchronisierung mit SQL-Abhängigkeit

Einige verteilte Caches von Drittanbietern, z. B. NCache , bieten Unterstützung für die Synchronisierung der SQL-Datenbank und des Caches mithilfe der SQL-Abhängigkeit. Weitere Informationen und ein Beispiel für die Quellcodeimplementierung finden Sie unter Beispiel für verteilten Cache mit SQL-Abhängigkeit.

Weitere Informationen