Sdílet prostřednictvím


SqlDependency v aplikaci ASP.NET

Stáhnout ADO.NET

Příklad v této části ukazuje, jak nepřímo použít SqlDependency pomocí 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ů.

Informace 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. Při načtení stránky a spuštění aplikace 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. Na stránku Default.aspx přidejte ovládací prvek Label a ovládací prvek GridView.

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

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

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

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

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. Č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. I když se mezipaměť aktualizuje, čas zobrazený na stránce se nezmění, dokud nedojde k události zpětného odeslání.

Další kroky