Share via


SqlDependency v aplikaci ASP.NET

Příklad v této části ukazuje, jak nepřímo použít SqlDependency využití ASP.NET SqlCacheDependency objektu. Objekt SqlCacheDependency používá SqlDependency k naslouchání oznámením a správné aktualizaci mezipaměti.

Poznámka:

Ukázkový kód předpokládá, že jste povolili oznámení dotazů spuštěním skriptů v povolení oznámení dotazů.

O ukázkové aplikaci

Ukázková aplikace používá jednu webovou stránku ASP.NET k zobrazení informací o produktu z databáze AdventureWorks SQL Serveru v ovládacím GridView prvku. Když se stránka načte, kód zapíše aktuální čas do Label ovládacího prvku. Pak definuje SqlCacheDependency objekt a nastaví vlastnosti Cache objektu pro uložení dat mezipaměti po dobu až tří minut. Kód se pak připojí k databázi a načte data. Když se stránka načte a aplikace běží ASP.NET načte data z mezipaměti, což můžete ověřit tak, že zjistíte, že se čas na stránce nezmění. Pokud se monitorovaná data změní, ASP.NET zneplatní mezipaměť a znovu naplní GridView ovládací prvek čerstvými daty, aktualizuje čas zobrazený v ovládacím Label prvku.

Vytvoření ukázkové aplikace

Pokud chcete vytvořit a spustit ukázkovou aplikaci, postupujte takto:

  1. Vytvořte nový web ASP.NET.

  2. Label Na stránku Default.aspx přidejte ovládací prvek a GridView ovládací prvek.

  3. Otevřete modul třídy stránky a přidejte následující direktivy:

    Option Strict On  
    Option Explicit On  
    
    Imports System.Data.SqlClient  
    
    using System.Data.SqlClient;  
    using System.Web.Caching;  
    
  4. Do události stránky Page_Load přidejte následující kód:

    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. Přidejte dvě pomocné metody GetConnectionString a GetSQL. Definovaný připojovací řetězec používá integrované zabezpečení. Budete muset ověřit, že účet, který používáte, má potřebná oprávnění k databázi a že ukázková databáze AdventureWorks má povolená oznámení.

    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
    

Testování aplikace

Aplikace ukládá data zobrazená ve webovém formuláři do mezipaměti a aktualizuje je každých tři minuty, pokud neexistuje žádná aktivita. Pokud dojde ke změně databáze, mezipaměť se okamžitě aktualizuje. Spusťte aplikaci ze sady Visual Studio, která načte stránku do prohlížeče. Zobrazený čas aktualizace mezipaměti označuje, kdy byla mezipaměť naposledy aktualizována. Počkejte tři minuty a pak aktualizujte stránku, což způsobí, že dojde k události postback. Všimněte si, že čas zobrazený na stránce se změnil. Pokud stránku aktualizujete za méně než tři minuty, zůstane čas zobrazený na stránce stejný.

Teď aktualizujte data v databázi pomocí příkazu Transact-SQL UPDATE a aktualizujte stránku. Zobrazený čas teď značí, že mezipaměť byla aktualizována novými daty z databáze. Všimněte si, že i když se mezipaměť aktualizuje, čas zobrazený na stránce se nezmění, dokud nedojde k události zpětného odeslání.

Synchronizace distribuované mezipaměti pomocí závislosti SQL

Některé z distribuovaných mezipamětí třetích stran, jako je NCache , poskytují podporu synchronizace databáze SQL a mezipaměti pomocí závislosti SQL. Další informace a ukázkovou implementaci zdrojového kódu najdete v ukázce závislostí SQL distribuované mezipaměti.

Viz také