Condividi tramite


SqlDependency in un'applicazione ASP.NET (ADO.NET)

Nell'esempio riportato in questa sezione viene illustrato l'utilizzo di SqlDependency in modo indiretto sfruttando l'oggetto SqlCacheDependency di ASP.NET. L'oggetto SqlCacheDependency utilizza un oggetto SqlDependency per ascoltare le notifiche e aggiornare correttamente la cache.

NotaNota

Nel codice di esempio si presuppone che le notifiche di query siano state abilitate eseguendo gli script descritti in Abilitazione di notifiche di query (ADO.NET).

Informazioni sull'applicazione di esempio

Nell'applicazione di esempio viene utilizzata una singola pagina Web ASP.NET per visualizzare in un controllo GridView le informazioni sul prodotto disponibili nel database AdventureWorks di SQL Server. Durante il caricamento della pagina, il codice scrive l'ora corrente in un controllo Label. Viene quindi definito un oggetto SqlCacheDependency e vengono impostate le proprietà nell'oggetto Cache per archiviare i dati della cache per un massimo di tre minuti. Viene quindi eseguita la connessione al database e vengono recuperati i dati. Quando viene caricata la pagina e l'applicazione è in esecuzione, ASP.NET recupererà i dati dalla cache, come è possibile verificare osservando che l'ora della pagina rimane invariata. Se i dati da monitorare cambiano, ASP.NET invalida la cache e ripopola il controllo GridView con nuovi dati, aggiornando l'ora visualizzata nel controllo Label.

Creazione dell'applicazione di esempio

Per creare ed eseguire l'applicazione di esempio, eseguire la procedura seguente:

  1. Creare un nuovo sito Web ASP.NET.

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

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

    Option Strict On
    Option Explicit On
    
    Imports System.Data.SqlClient
    using System.Data.SqlClient;
    using System.Web.Caching;
    
  4. Aggiungere il codice seguente nell'evento Page_Load della pagina:

    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. Aggiungere due metodi di supporto, GetConnectionString e GetSQL. La stringa di connessione definita utilizza la sicurezza integrata. Sarà necessario verificare che l'account in uso disponga delle autorizzazioni del database richieste e che siano abilitate le notifiche nel database di esempio AdventureWorks. Per ulteriori informazioni, vedere Special Considerations When Using Query Notifications.

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

Test dell'applicazione

L'applicazione memorizza nella cache i dati visualizzati sul form Web e li aggiorna ogni tre minuti in assenza di attività. Se il database viene modificato, la cache viene immediatamente aggiornata. Eseguire l'applicazione da Visual Studio per caricare la pagina nel browser. L'ora di aggiornamento della cache visualizzata indica quando la cache è stata aggiornata per l'ultima volta. Attendere tre minuti e quindi aggiornare la pagina, in modo da causare un evento postback. Notare che l'ora visualizzata nella pagina è cambiata. Se si aggiorna la pagina prima dei tre minuti, l'ora visualizzata nella pagina rimarrà la stessa.

A questo punto aggiornare i dati nel database, utilizzando un comandi UPDATE Transact-SQL, quindi aggiornare la pagina. Adesso l'ora visualizzata indica che la cache è stata aggiornata automaticamente con i nuovi dati del database. Notare che, anche se la cache è stata aggiornata, l'ora visualizzata nella pagina non cambia finché non si verifica un evento postback.

Vedere anche

Altre risorse

Notifiche di query in SQL Server (ADO.NET)