次の方法で共有


ASP.NET アプリケーションでの SqlDependency

ADO.NET のダウンロード

このセクションの例では、ASP.NET SqlCacheDependency オブジェクトを使用して、SqlDependency を間接的に使用する方法を示します。 SqlCacheDependency オブジェクトでは SqlDependency を使用して通知をリッスンし、キャッシュを適切に更新します。

Note

このサンプル コードを実行するには、「クエリ通知の有効化」のスクリプトを実行してクエリ通知を有効にしておく必要があります。

サンプル アプリケーションについて

このサンプル アプリケーションでは、1 つの ASP.NET Web ページを使用して、SQL Server データベースである AdventureWorks に格納されている製品情報を GridView コントロールに表示します。 ページが読み込まれる際に、コードによって Label コントロールに現在の時刻が書き込まれます。 次に、SqlCacheDependency オブジェクトが定義され、最大 3 分間キャッシュ データが格納されるように Cache オブジェクトのプロパティが設定されます。 その後、データベースに接続され、データが取得されます。 ページが読み込まれ、アプリケーションが実行されると、ASP.NET によってデータがキャッシュから取得されます。ページの時刻が変わっていなければ、取得されたことが確認できます。 監視対象のデータが変更されると、ASP.NET によってキャッシュが無効になり、GridView コントロールに最新データが再入力されます。これにより、Label コントロールに表示される時刻が更新されます。

サンプル アプリケーションの作成

サンプル アプリケーションを作成して実行するには、次の手順に従います。

  1. 新しい ASP.NET Web サイトを作成します。

  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 という 2 つのヘルパー メソッドを追加します。 定義される接続文字列は、統合セキュリティを利用します。 使用しているアカウントに、必要とされるデータベースへのアクセス許可が付与されており、サンプル データベース 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;";
    }
    

アプリケーションのテスト

このアプリケーションを使用すると、Web フォームに表示されるデータがキャッシュされ、アクティビティがなければ 3 分ごとにそのデータが更新されます。 データベースに変更があれば、キャッシュは直ちに更新されます。 Visual Studio からアプリケーションを実行すると、ブラウザーにページが読み込まれます。 表示されるキャッシュ更新時刻は、最後にキャッシュが更新された時刻を示します。 3 分間の待機後、ページを更新すると、ポストバック イベントが発生します。 ページに表示される時刻が変わりました。 3 分経過する前にページを更新した場合、ページに表示される時刻は変わりません。

次に、Transact-SQL の UPDATE コマンドを使用して、データベース内のデータを更新し、ページを最新の情報で更新します。 表示される時刻を見ると、データベースの新しいデータを使ってキャッシュが更新されたことがわかります。 キャッシュは更新されますが、ページに表示される時刻は、ポストバック イベントが発生するまで変わりません。

次のステップ