Partilhar via


SqlDependency em um aplicativo ASP.NET

Baixar ADO.NET

O exemplo nesta secção mostra como usar SqlDependency indiretamente usando o objeto ASP.NET SqlCacheDependency . O SqlCacheDependency objeto usa um SqlDependency para ouvir notificações e atualizar corretamente a cache.

Observação

O código de exemplo assume que ativou as notificações de consulta ao executar os scripts em Ativar notificações de consulta.

Sobre o aplicativo de exemplo

A aplicação de exemplo utiliza uma única página Web ASP.NET para mostrar informações do produto da base de dados SQL Server do AdventureWorks num controlo GridView. Quando a página é carregada, o código escreve a hora atual num Label controlo. Depois define um SqlCacheDependency objeto e define propriedades no Cache objeto para armazenar os dados da cache durante até três minutos. O código liga-se então à base de dados e recupera os dados. Quando a página é carregada e a aplicação está a correr ASP.NET recupera dados da cache, o que pode verificar notando que a hora na página não muda. Se os dados monitorizados mudarem, ASP.NET invalida a cache e repreenche o GridView controlo com dados novos, atualizando o tempo apresentado no Label controlo.

Criação da aplicação de exemplo

Siga estes passos para criar e executar a aplicação de exemplo:

  1. Crie um novo site ASP.NET.

  2. Adicione um Label e um GridView controle à página Default.aspx.

  3. Abra o módulo de classes da página e adicione as seguintes diretivas:

    using Microsoft.Data.SqlClient;
    using System.Web.Caching;
    
  4. Adicione o seguinte código no evento da Page_Load 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. Adiciona dois métodos auxiliares, GetConnectionString e GetSQL. A cadeia de ligação definida utiliza segurança integrada. Verifica se a conta que estás a usar tem as permissões necessárias para a base de dados e que a base de dados de exemplo, AdventureWorks, tem notificações ativadas.

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

Testando o aplicativo

A aplicação armazena em cache os dados exibidos no formulário Web e atualiza-os a cada três minutos se não houver atividade. Se ocorrer uma alteração na base de dados, a cache é atualizada imediatamente. Executa a aplicação a partir do Visual Studio, que carrega a página no navegador. O tempo de atualização da cache apresentado indica quando a cache foi atualizada pela última vez. Espere três minutos e, em seguida, atualize a página, provocando um evento de postback. A hora apresentada na página mudou. Se atualizar a página em menos de três minutos, o tempo apresentado na página permanecerá o mesmo.

Agora atualiza os dados na base de dados usando um comando Transact-SQL UPDATE e atualiza a página. A hora apresentada indica agora que a cache foi atualizada com os novos dados da base de dados. Embora a cache seja atualizada, a hora apresentada na página não muda até ocorrer um evento de postback.

Próximos passos