SqlDependency in un'applicazione ASP.NETSqlDependency in an ASP.NET Application

Nell'esempio riportato in questa sezione viene illustrato l'uso di SqlDependency in modo indiretto sfruttando l'oggetto SqlCacheDependency di ASP.NET.The example in this section shows how to use SqlDependency indirectly by leveraging the ASP.NET SqlCacheDependency object. L'oggetto SqlCacheDependency usa un oggetto SqlDependency per ascoltare le notifiche e aggiornare correttamente la cache.The SqlCacheDependency object uses a SqlDependency to listen for notifications and correctly update the cache.

Nota

Il codice di esempio si presuppone che si siano abilitate le notifiche delle query tramite l'esecuzione degli script abilitazione le notifiche delle Query.The sample code assumes that you have enabled query notifications by executing the scripts in Enabling Query Notifications.

Informazioni sull'applicazione di esempioAbout the Sample Application

Applicazione di esempio utilizza una singola pagina Web ASP.NET per visualizzare informazioni sui prodotti dal AdventureWorks database di SQL Server in un GridView controllo.The sample application uses a single ASP.NET Web page to display product information from the AdventureWorks SQL Server database in a GridView control. Durante il caricamento della pagina, il codice scrive l'ora corrente in un controllo Label.When the page loads, the code writes the current time to a Label control. 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.It then defines a SqlCacheDependency object and sets properties on the Cache object to store the cache data for up to three minutes. Viene quindi eseguita la connessione al database e vengono recuperati i dati.The code then connects to the database and retrieves the data. 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.When the page is loaded and the application is running ASP.NET will retrieve data from the cache, which you can verify by noting that the time on the page does not change. 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.If the data being monitored changes, ASP.NET invalidates the cache and repopulate the GridView control with fresh data, updating the time displayed in the Label control.

Creazione dell'applicazione di esempioCreating the Sample Application

Per creare ed eseguire l'applicazione di esempio, eseguire la procedura seguente:Follow these steps to create and run the sample application:

  1. Creare un nuovo sito Web ASP.NET.Create a new ASP.NET Web site.

  2. Aggiungere un controllo Label e un controllo GridView alla pagina Default.aspx.Add a Label and a GridView control to the Default.aspx page.

  3. Aprire il modulo di classe della pagina e aggiungere le direttive seguenti:Open the page's class module and add the following directives:

    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:Add the following code in the page's Page_Load event:

    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. Aggiungere due metodi di supporto, GetConnectionString e GetSQL.Add two helper methods, GetConnectionString and GetSQL. La stringa di connessione definita usa la sicurezza integrata.The connection string defined uses integrated security. È necessario verificare che l'account in uso disponga di autorizzazioni di database necessari e che il database di esempio AdventureWorks, siano abilitate le notifiche.You will need to verify that the account you are using has the necessary database permissions and that the sample database, AdventureWorks, has notifications enabled. Per ulteriori informazioni, vedere speciali considerazioni quando tramite le notifiche delle Query.For more information, see Special Considerations When Using Query Notifications.

    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 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
    

Verifica dell'applicazioneTesting the Application

L'applicazione memorizza nella cache i dati visualizzati sul form Web e li aggiorna ogni tre minuti in assenza di attività.The application caches the data displayed on the Web form and refreshes it every three minutes if there is no activity. Se il database viene modificato, la cache viene immediatamente aggiornata.If a change occurs to the database, the cache is refreshed immediately. Eseguire l'applicazione da Visual Studio per caricare la pagina nel browser.Run the application from Visual Studio, which loads the page into the browser. L'ora di aggiornamento della cache visualizzata indica quando la cache è stata aggiornata per l'ultima volta.The cache refresh time displayed indicates when the cache was last refreshed. Attendere tre minuti e quindi aggiornare la pagina, in modo da causare un evento postback.Wait three minutes, and then refresh the page, causing a postback event to occur. Notare che l'ora visualizzata nella pagina è cambiata.Note that the time displayed on the page has changed. Se si aggiorna la pagina prima dei tre minuti, l'ora visualizzata nella pagina rimarrà la stessa.If you refresh the page in less than three minutes, the time displayed on the page will remain the same.

A questo punto aggiornare i dati nel database, usando un comandi UPDATE Transact-SQL, quindi aggiornare la pagina.Now update the data in the database, using a Transact-SQL UPDATE command and refresh the page. Adesso l'ora visualizzata indica che la cache è stata aggiornata automaticamente con i nuovi dati del database.The time displayed now indicates that the cache was refreshed with the new data from the database. Notare che, anche se la cache è stata aggiornata, l'ora visualizzata nella pagina non cambia finché non si verifica un evento postback.Note that although the cache is updated, the time displayed on the page does not change until a postback event occurs.

Vedere ancheSee Also

Notifiche di query in SQL ServerQuery Notifications in SQL Server
Provider gestiti ADO.NET e Centro per sviluppatori di set di datiADO.NET Managed Providers and DataSet Developer Center