ASP.NET 應用程式中的 SqlDependency

本節中的範例將顯示如何藉由使用 ASP.NET SqlDependency 物件,間接使用 SqlCacheDependencySqlCacheDependency 物件會使用 SqlDependency 來接聽通知,並正確更新快取。

注意

此範例程式碼假設您已執行啟用查詢通知中的指令碼來啟用查詢通知。

關於範例應用程式

此範例應用程式會使用單一 ASP.NET 網頁,在 GridView 控制項中顯示 AdventureWorks SQL Server 資料庫的產品資訊。 當頁面載入時,程式碼會將目前的時間寫入至 Label 控制項。 然後會定義 SqlCacheDependency 物件,並在 Cache 物件上設定屬性,以儲存快取資料長達三分鐘。 然後,程式碼會連線到資料庫並擷取資料。 當頁面已載入而且應用程式正在執行時,ASP.NET 將從快取中擷取資料,而且您可以注意頁面上的時間沒有變更來確認這點。 如果正在監視的資料有變更,ASP.NET 會讓快取無效並將新資料重新填入 GridView 控制項,而且更新 Label 控制項中顯示的時間。

建立範例應用程式

遵循下列步驟,以建立並執行範例應用程式:

  1. 建立新的 ASP.NET 網站。

  2. LabelGridView 控制項新增至 Default.aspx 頁面。

  3. 開啟頁面的類別模組並新增下列指示詞:

    Option Strict On  
    Option Explicit On  
    
    Imports System.Data.SqlClient  
    
    using System.Data.SqlClient;  
    using System.Web.Caching;  
    
  4. 在頁面的 Page_Load 事件中新增下列程式碼:

    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. 新增兩個協助程式方法:GetConnectionStringGetSQL。 定義的連接字串會使用整合式安全性。 您需要驗證所使用之帳戶具有必要的資料庫使用權限,且範例資料庫 AdventureWorks 已啟用通知。

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

測試應用程式

應用程式會快取顯示在 Web Form 上的資料,並每隔三分鐘重新整理它一次 (如果沒有任何活動的話)。 如果資料庫發生變更,就會立即重新整理快取。 從 Visual Studio 執行應用程式,以將頁面載入瀏覽器。 顯示的快取重新整理時間表示上次重新整理快取的時間。 等候三分鐘,然後重新整理頁面,即會導致回傳事件發生。 請注意,顯示在頁面上的時間已經變更。 如果您在三分鐘內重新整理頁面,則頁面上顯示的時間將維持不變。

現在,請使用 Transact-SQL UPDATE 命令來更新資料庫中的資料,並重新整理頁面。 此時顯示的時間表示已使用資料庫的新資料來重新整理快取。 請注意,雖然快取已更新,但是顯示在頁面上的時間要等到發生回傳事件之後才會變更。

使用 SQL 相依性進行分散式快取同步處理

一些 NCache 這類協力廠商分散式快取支援使用 SQL 相依性來同步處理 SQL資料庫和快取。 如需詳細資訊和範例原始程式碼實作,請參閱分散式快取 SQL 相依性範例

另請參閱