Freigeben über


'SqlDependency' in einer ASP.NET-Anwendung (ADO.NET)

Aktualisiert: November 2007

Das Beispiel in diesem Abschnitt zeigt die indirekte Verwendung von SqlDependency durch Verwendung des ASP.NET-SqlCacheDependency-Objekts. Das SqlCacheDependency-Objekt verwendet eine SqlDependency, um Benachrichtigungen zu empfangen und den Cache ordnungsgemäß zu aktualisieren.

Hinweis:

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

Die Beispielanwendung

In der Beispielanwendung wird eine einzelne ASP.NET-Webseite verwendet, um Produktinformationen aus der SQL Server-Datenbank AdventureWorks in einem GridView-Steuerelement anzuzeigen. Beim Laden der Seite schreibt der Code die aktuelle Zeit in ein Label-Steuerelement. Anschließend wird ein SqlCacheDependency-Objekt definiert, und es werden Eigenschaften für das Cache-Objekt festgelegt, um die Daten für bis zu drei Minuten zwischenzuspeichern. 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, die Sie anhand dessen verifizieren können, 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 mit frischen Daten auf. Dabei wird die im Label-Steuerelement angezeigte Zeit aktualisiert.

Erstellen der Beispielanwendung

Gehen Sie zum Erstellen und Ausführen der Beispielanwendung wie folgt vor:

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

  2. Fügen Sie der Seite Default.aspx ein Label-Steuerelement und ein GridView-Steuerelement hinzu.

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

    Option Strict On
    Option Explicit On
    
    Imports System.Data.SqlClient
    using System.Data.SqlClient;
    using System.Web.Caching;
    
  4. Fügen Sie dem Page_Load-Ereignis der Seite folgenden Code hinzu:

    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();
            }
        }
    }
    
  5. Fügen Sie zwei Hilfsmethoden hinzu, GetConnectionString und GetSQL. Die definierte Verbindungszeichenfolge verwendet 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. Weitere Informationen dazu finden Sie unter Besonderheiten bei der Verwendung von Abfragebenachrichtigungen (ADO.NET).

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

Testen der Anwendung

Die im Webformular angezeigten Daten werden von der Anwendung zwischengespeichert und, sofern keine Aktivitäten zu verzeichnen sind, alle drei Minuten aktualisiert. Wenn eine Änderung an der Datenbank vorgenommen wird, wird der Cache sofort aktualisiert. Starten Sie die Anwendung von Visual Studio aus. Visual Studio lädt die Seite in den Browser. Die angezeigte Uhrzeit für die Cacheaktualisierung gibt an, wann der Cache zuletzt aktualisiert wurde. Warten Sie drei Minuten, und aktualisieren Sie dann die Seite. Daraufhin kommt es zu einem Postbackereignis. Beachten Sie, dass sich die auf der Seite angezeigte Zeit geändert hat. Wenn Sie die Seite vor Ablauf von drei Minuten aktualisieren, ändert sich die auf der Seite angezeigte Uhrzeit nicht.

Aktualisieren Sie nun mithilfe eines Transact-SQL-UPDATE-Befehls die Daten in der Datenbank und aktualisieren Sie die Seite. Die angezeigte Uhrzeit gibt jetzt an, dass der Cache mit den neuen Daten aus der Datenbank aktualisiert wurde. Beachten Sie, dass der Cache zwar aktualisiert wurde, dass aber die auf der Seite angezeigte Uhrzeit sich erst ändert, wenn ein Postbackereignis eintritt.

Siehe auch

Weitere Ressourcen

Abfragebenachrichtigungen in SQL Server (ADO.NET)