Поделиться через


SqlDependency в приложении ASP.NET

Скачать ADO.NET

В приведенном в этом разделе примере показано, как неявно применять SqlDependency, используя объект SqlCacheDependency ASP.NET. Объект SqlCacheDependency использует SqlDependency для прослушивания уведомлений и корректного обновления кэша.

Примечание

В примере кода предполагается, что уведомления о запросах включены путем выполнения скриптов из этой статьи.

Сведения о примере приложения

В примере приложения используется одна веб-страница ASP.NET для вывода сведений о продуктах из базы данных AdventureWorks SQL Server в элемент управления GridView. При загрузке страницы код записывает текущее время в элемент управления Label. Затем он определяет объект SqlCacheDependency и задает свойства объекта Cache для сохранения данных кэша до трех минут. Затем код подключается к базе данных и получает данные. При загрузке страницы и работе приложения ASP.NET будет получать данные из кэша. Чтобы проверить это, обратите внимание на время, указанное на странице, оно не должно меняться. Если наблюдаемые данные изменяются, ASP.NET делает недействительным кэш и повторно заполняет элемент управления GridView новыми данными, обновляя время в элементе управления Label.

Создание примера приложения

Чтобы создать и запустить пример приложения, выполните следующие действия:

  1. Создание нового веб-сайта ASP.NET.

  2. Добавьте Label и элемент управления GridView на страницу Default.aspx.

  3. Откройте модуль класса страницы и добавьте следующие директивы:

    using Microsoft.Data.SqlClient;
    using System.Web.Caching;
    
  4. Добавьте следующий код в событие Page_Load страницы:

    // 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. Добавьте два вспомогательных метода: GetConnectionString и GetSQL. В определенной строке соединения используются интегрированные средства безопасности. Убедитесь, что используемая учетная запись обладает необходимыми разрешениями для базы данных, а в образце базы данных AdventureWorks включены уведомления.

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

Тестирование приложения

Приложение кэширует данные, отображаемые в веб-форме, и обновляет их каждые три минуты, если нет действий. Если в базе данных происходит изменение, кэш обновляется немедленно. Запустите приложение из Visual Studio, чтобы загрузить страницу в браузер. Отображаемое время обновления кэша указывает, когда кэш был обновлен последний раз. Подождите три минуты, а затем обновите страницу, в результате чего произойдет событие обратной передачи. Время, отображаемое на странице, изменилось. Если обновить страницу меньше чем через три минуты, время, отображаемое на странице, останется прежним.

Теперь обновите данные в базе данных, используя команду Transact-SQL UPDATE, затем обновите страницу. Теперь по отображаемому времени можно понять, что кэш был обновлен с учетом новых данных из базы данных. Несмотря на обновление кэша, время на странице не изменяется, пока не произойдет событие обратной передачи.

Дальнейшие действия