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

  • 質問

  • お世話になります。

    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

    です。

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



    • 編集済み r-ikeda 2014年6月10日 6:01
    2014年6月10日 5:15

回答

  • 技術系メーリングリストで質問するときのパターン・ランゲージなどを参考にどのように質問をすれば他者とコミュニケーションできるかを考慮してください。特に「実行手順」が不足しています。
    • 回答としてマーク 星 睦美 2014年6月26日 4:14
    2014年6月10日 5:23
  • クエリ通知の有効化その他の設定が全て完璧にできていたとして・・・(そのあたり、ちょっと疑問ですが)

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

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

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

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

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

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

    • 回答としてマーク 星 睦美 2014年6月26日 4:14
    2014年6月10日 7:20

すべての返信

  • 技術系メーリングリストで質問するときのパターン・ランゲージなどを参考にどのように質問をすれば他者とコミュニケーションできるかを考慮してください。特に「実行手順」が不足しています。
    • 回答としてマーク 星 睦美 2014年6月26日 4:14
    2014年6月10日 5:23
  • クエリ通知の有効化その他の設定が全て完璧にできていたとして・・・(そのあたり、ちょっと疑問ですが)

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

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

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

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

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

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

    • 回答としてマーク 星 睦美 2014年6月26日 4:14
    2014年6月10日 7:20
  • ご回答ありがとうございます。

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

    2014年6月10日 14:25
  • > 基本的なところから勉強しなおします。

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

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

    2014年6月11日 0:48