Share via


SqlDependency in un'applicazione ASP.NET

Scarica ADO.NET

L'esempio riportato in questa sezione illustra come usare SqlDependency indirettamente usando l'oggetto ASP.NET SqlCacheDependency. L'oggetto SqlCacheDependency usa un SqlDependency per ascoltare le notifiche e aggiornare correttamente la cache.

Nota

Nell'esempio di codice si presuppone che le notifiche di query siano state abilitate eseguendo gli script descritti in Abilitazione di notifiche di query.

Informazioni sull'applicazione di esempio

Nell'applicazione di esempio viene usata una singola pagina Web ASP.NET per visualizzare in un controllo GridView le informazioni sui prodotti disponibili nel database AdventureWorks di SQL Server. Quando la pagina viene caricata il codice scrive l'ora corrente in un controllo Label. Definisce quindi un oggetto SqlCacheDependency e imposta le proprietà nell'oggetto Cache per archiviare i dati della cache per un massimo di tre minuti. Il codice si connette quindi al database e recupera i dati. Quando la pagina viene caricata e l'applicazione è in esecuzione ASP.NET recupera i dati dalla cache ed è possibile verificarlo osservando che l'ora sulla pagina non cambia. Se i dati monitorati cambiano, ASP.NET invalida la cache e ripopola il controllo GridView con i dati aggiornati, adeguando l'ora visualizzata nel controllo Label.

Creazione dell'applicazione di esempio

Per creare ed eseguire l'applicazione di esempio, seguire questa procedura:

  1. Creare un nuovo sito Web ASP.NET.

  2. Aggiungere un Label e un controllo GridView alla pagina Default.aspx.

  3. Aprire il modulo di classe della pagina e aggiungere le direttive seguenti:

    using Microsoft.Data.SqlClient;
    using System.Web.Caching;
    
  4. Aggiungere il codice seguente all'evento Page_Load della pagina:

    // 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. Aggiungere due metodi helper, GetConnectionString e GetSQL. La stringa di connessione definita usa la sicurezza integrata. Verificare che l'account in uso abbia le autorizzazioni del database richieste e che siano abilitate le notifiche nel database di esempio, AdventureWorks.

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

Test dell'applicazione

L'applicazione memorizza nella cache i dati visualizzati nel Web Form e li aggiorna ogni tre minuti se non è presente alcuna attività. Se viene apportata una modifica al database, la cache viene aggiornata immediatamente. Eseguire l'applicazione da Visual Studio, che carica la pagina nel browser. L'ora di aggiornamento della cache visualizzata indica il momento in cui la cache è stata aggiornata l'ultima volta. Attendere tre minuti e quindi aggiornare la pagina, causando l'esecuzione di un evento di postback. L'ora visualizzata nella pagina è cambiata. Se si aggiorna la pagina in meno di tre minuti, l'ora visualizzata sulla pagina rimane invariata.

A questo punto aggiornare i dati nel database usando un comando Transact-SQL UPDATE e aggiornare la pagina. L'ora visualizzata indica che la cache è stata aggiornata con i nuovi dati provenienti dal database. Sebbene la cache venga aggiornata, l'ora visualizzata sulla pagina non cambia finché non si verifica un evento di postback.

Passaggi successivi