SqlDependency en una aplicación ASP.NETSqlDependency in an ASP.NET Application

En el ejemplo de esta sección se muestra cómo utilizar SqlDependency de forma indirecta aprovechando el objeto SqlCacheDependency de ASP:NET.The example in this section shows how to use SqlDependency indirectly by leveraging the ASP.NET SqlCacheDependency object. El objeto SqlCacheDependency utiliza SqlDependency para escuchar notificaciones y de actualizar correctamente la caché.The SqlCacheDependency object uses a SqlDependency to listen for notifications and correctly update the cache.

Nota

En el código de ejemplo se supone que ha habilitado las notificaciones de consulta ejecutando los scripts en habilitando las notificaciones de consulta.The sample code assumes that you have enabled query notifications by executing the scripts in Enabling Query Notifications.

Acerca de la aplicación de ejemploAbout the Sample Application

La aplicación de ejemplo utiliza una única página web de ASP.net para mostrar información de productos de la base de GridView datos de SQL Server AdventureWorks en un control.The sample application uses a single ASP.NET Web page to display product information from the AdventureWorks SQL Server database in a GridView control. Cuando se carga la página, el código escribe la hora actual en un control Label.When the page loads, the code writes the current time to a Label control. A continuación, se define un objeto SqlCacheDependency y se establecen las propiedades del objeto Cache para almacenar los datos de la caché durante tres minutos como máximo.It then defines a SqlCacheDependency object and sets properties on the Cache object to store the cache data for up to three minutes. Entonces el código se conecta a la base de datos y recupera los datos.The code then connects to the database and retrieves the data. Cuando la página está cargada y la aplicación se está ejecutando, ASP.NET recuperará datos de la caché, lo cual podrá comprobar si observa que la hora de la página no cambia.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. Si los datos que se supervisan cambian, ASP.NET invalida la caché y vuelve a llenar el control GridView con datos nuevos, actualizando la hora que se muestra en el control 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.

Crear la aplicación de ejemploCreating the Sample Application

Para crear y ejecutar la aplicación de ejemplo, siga estos pasos:Follow these steps to create and run the sample application:

  1. Cree un nuevo sitio web ASP.NET.Create a new ASP.NET Web site.

  2. Agregue un control Label y GridView a la página Default.aspx.Add a Label and a GridView control to the Default.aspx page.

  3. Abra el módulo de clase de la página y agregue las siguientes directivas: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. Agregue el siguiente código al evento Page_Load de la página: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. Agregue dos métodos del asistente: GetConnectionString y GetSQL.Add two helper methods, GetConnectionString and GetSQL. La cadena de conexión definida utiliza seguridad integrada.The connection string defined uses integrated security. Tendrá que comprobar que la cuenta que está usando tiene los permisos de base de datos necesarios y que la base de datos de ejemplo, AdventureWorks, tiene habilitadas las notificaciones.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.

    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
    

Probar la aplicaciónTesting the Application

La aplicación almacena en caché los datos mostrados en el formulario web y los actualiza cada tres minutos si no hay ninguna actividadThe application caches the data displayed on the Web form and refreshes it every three minutes if there is no activity. Si se produce un cambio en la base de datos, la caché se actualiza inmediatamente.If a change occurs to the database, the cache is refreshed immediately. Ejecute la aplicación desde Visual Studio, que carga la página en el explorador.Run the application from Visual Studio, which loads the page into the browser. La hora de actualización de la caché que se muestra indica la hora de la última actualización.The cache refresh time displayed indicates when the cache was last refreshed. Espere tres minutos y, a continuación, actualice la página, lo que dará lugar a un evento postback de datos.Wait three minutes, and then refresh the page, causing a postback event to occur. Observe que la hora que se muestra en la página ha cambiado.Note that the time displayed on the page has changed. Si actualiza la página sin esperar los tres minutos, la hora mostrada será la misma.If you refresh the page in less than three minutes, the time displayed on the page will remain the same.

A continuación, actualice los datos de la base de datos mediante un comando UPDATE deTransact-SQL y actualice la página.Now update the data in the database, using a Transact-SQL UPDATE command and refresh the page. La hora que se muestra indica ahora que la caché se ha actualizado con los datos nuevos de la base de datos.The time displayed now indicates that the cache was refreshed with the new data from the database. Tenga en cuenta que, aunque la caché está actualizada, la hora que se muestra en la página no cambia hasta que se produce un evento postback de datos.Note that although the cache is updated, the time displayed on the page does not change until a postback event occurs.

Vea tambiénSee also