クエリ通知機能のサンプルPG

Category: fx aspnet_ja

Question

r-ikeda on Tue, 10 Jun 2014 05:15:56


お世話になります。

SQLServerのクエリ通知を使用したく

「SQLServerのクエリ通知」のサンプルをコピペして動作を確認したところページはエラーなく表示できるのですが

DBを更新しても、ページの更新がされません。

==================================

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Web.Caching;
using System.Security.Permissions;


public partial class _Default : System.Web.UI.Page
{

    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 = 1;
                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();
            }
        }
    }
    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=AdventureWorks2012;";
    }
    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;";
    }

}

============================================

尚、

ALTER DATABASE AdventureWorks SET ENABLE_BROKER;

CREATE QUEUE ContactChangeMessages;

CREATE SERVICE ContactChangeNotifications
  ON QUEUE ContactChangeMessages
([http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]);

はSQLServer2012で実行済みです。

上記のサンプルPGで環境によって他に設定があるのでしょうか?

環境は

windowsSrever2012R2

SQLServer2012

VB2012

サンプルDB AdventureWorks2012

です。

ご教授よろしくお願いします。



Replies

佐祐理 on Tue, 10 Jun 2014 05:23:50


技術系メーリングリストで質問するときのパターン・ランゲージなどを参考にどのように質問をすれば他者とコミュニケーションできるかを考慮してください。特に「実行手順」が不足しています。

SurferOnWww on Tue, 10 Jun 2014 07:20:40


クエリ通知の有効化その他の設定が全て完璧にできていたとして・・・(そのあたり、ちょっと疑問ですが)

> DBを更新しても、ページの更新がされません。

DB を更新しただけではブラウザに表示されているページは更新されません。

SQL キャッシュ依存関係とは、ASP.NET のキャッシュと SQL Server DB のテーブルやレコードとの間に依存関係を持たせ、当該テーブル/レコードが変更されたら ASP.NET のキャッシュを削除し、次の要求では新しいデータを DB から(キャッシュからではなく)取得してユーザーに提供するとともに、新しいデータをキャッシュするための機能です。

SQL Server からクエリ通知を受け取るのは Web サーバーです。ブラウザではありません。Web サーバーはクエリ通知を受け取ると保持しているキャッシュを削除するだけです。その時点ではブラウザには何の影響もありません。

その後、ユーザーが再度 Web サーバーに要求をかけて初めて更新後の DB の内容が取得され、GridView にバインドされ、html に変換されてブラウザに送信され、表示されます。

そのあたりの基本的なことは理解されているでしょうか?

r-ikeda on Tue, 10 Jun 2014 14:25:54


ご回答ありがとうございます。

基本的なところから勉強しなおします。

SurferOnWww on Wed, 11 Jun 2014 00:48:22


> 基本的なところから勉強しなおします。

ということは、やはり、DB が変更されるとブラウザに表示されているページも新しい内容に更新されると思われていたのでしょうか?

質問する際は局所的な疑問だけでなく、全体的なシナリオを含めてやりたいことを書くことをお勧めします。
 
そうすれば、「それはできないけど、やりたいことはこうすれば実現できる」というような代案が出てくることもありますので。