Share via


SqlDependency en una aplicación ASP.NET

Descargar ADO.NET

En el ejemplo de esta sección se muestra cómo usar SqlDependency indirectamente por medio del objeto SqlCacheDependency de ASP.NET. El objeto SqlCacheDependency usa SqlDependency para escuchar notificaciones y actualizar correctamente la memoria caché.

Nota:

En el ejemplo de código se parte de que las notificaciones de consulta están habilitadas mediante la ejecución de los scripts en Habilitación de notificaciones de consultas.

Información acerca de la aplicación de ejemplo

La aplicación de ejemplo usa una única página web de ASP.NET para mostrar información de producto de la base de datos AdventureWorks de SQL Server en un control GridView. Cuando se carga la página, el código escribe la hora actual en un control de Label. A continuación, define un objeto de SqlCacheDependency y establece propiedades en el objeto Cache para almacenar los datos de la memoria caché durante un máximo de tres minutos. Después, el código se conecta a la base de datos y recupera los datos. Cuando se carga la página y se ejecuta la aplicación, ASP.NET recuperará los datos de la caché, lo que puede comprobar si se fija en que la hora de la página no cambia. Si los datos que se supervisan cambian, ASP.NET invalida la caché y vuelve a rellenar el control GridView con datos nuevos, y actualiza la hora que se muestra en el control Label.

Creación de la aplicación de ejemplo

Siga estos pasos para crear y ejecutar la aplicación de ejemplo:

  1. Cree un nuevo sitio web de ASP.NET.

  2. Agregue un control Label y GridView a la página Default.aspx.

  3. Abra el módulo de clase de la página y agregue las siguientes directivas:

    using Microsoft.Data.SqlClient;
    using System.Web.Caching;
    
  4. Agregue el siguiente código en el evento Page_Load de la página:

    // 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. Agregue dos métodos del asistente, GetConnectionString y GetSQL. La cadena de conexión definida usa seguridad integrada. Compruebe que la cuenta que usa dispone de los permisos de base de datos necesarios y que la base de datos de ejemplo, AdventureWorks, tiene habilitadas las notificaciones.

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

Probar la aplicación

La aplicación almacena en caché los datos que se muestran en el formulario web y los actualiza cada tres minutos si no hay ninguna actividad. Si se produce un cambio en la base de datos, la caché se actualiza inmediatamente. Ejecute la aplicación desde Visual Studio, que carga la página en el explorador. La hora de actualización de la caché que se muestra indica cuándo se actualizó la memoria caché por última vez. Espere tres minutos y, a continuación, actualice la página, lo que hará que se produzca un evento de postback. La hora que se muestra en la página ha cambiado. Si actualiza la página en menos de tres minutos, la hora que se muestra en la página seguirá siendo la misma.

Ahora, actualice los datos de la base de datos mediante un comando UPDATE de Transact-SQL y actualice la página. La hora que se muestra ahora indica que la caché se ha actualizado con los nuevos datos de la base de datos. Aunque la caché se actualiza, la hora que se muestra en la página no cambia hasta que se produce un evento de postback.

Pasos siguientes