トップ回答者
クエリ通知機能のサンプルPG

質問
-
お世話になります。
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
回答
-
クエリ通知の有効化その他の設定が全て完璧にできていたとして・・・(そのあたり、ちょっと疑問ですが)
> DBを更新しても、ページの更新がされません。
DB を更新しただけではブラウザに表示されているページは更新されません。
SQL キャッシュ依存関係とは、ASP.NET のキャッシュと SQL Server DB のテーブルやレコードとの間に依存関係を持たせ、当該テーブル/レコードが変更されたら ASP.NET のキャッシュを削除し、次の要求では新しいデータを DB から(キャッシュからではなく)取得してユーザーに提供するとともに、新しいデータをキャッシュするための機能です。
SQL Server からクエリ通知を受け取るのは Web サーバーです。ブラウザではありません。Web サーバーはクエリ通知を受け取ると保持しているキャッシュを削除するだけです。その時点ではブラウザには何の影響もありません。
その後、ユーザーが再度 Web サーバーに要求をかけて初めて更新後の DB の内容が取得され、GridView にバインドされ、html に変換されてブラウザに送信され、表示されます。
そのあたりの基本的なことは理解されているでしょうか?
- 回答としてマーク 星 睦美 2014年6月26日 4:14
すべての返信
-
クエリ通知の有効化その他の設定が全て完璧にできていたとして・・・(そのあたり、ちょっと疑問ですが)
> DBを更新しても、ページの更新がされません。
DB を更新しただけではブラウザに表示されているページは更新されません。
SQL キャッシュ依存関係とは、ASP.NET のキャッシュと SQL Server DB のテーブルやレコードとの間に依存関係を持たせ、当該テーブル/レコードが変更されたら ASP.NET のキャッシュを削除し、次の要求では新しいデータを DB から(キャッシュからではなく)取得してユーザーに提供するとともに、新しいデータをキャッシュするための機能です。
SQL Server からクエリ通知を受け取るのは Web サーバーです。ブラウザではありません。Web サーバーはクエリ通知を受け取ると保持しているキャッシュを削除するだけです。その時点ではブラウザには何の影響もありません。
その後、ユーザーが再度 Web サーバーに要求をかけて初めて更新後の DB の内容が取得され、GridView にバインドされ、html に変換されてブラウザに送信され、表示されます。
そのあたりの基本的なことは理解されているでしょうか?
- 回答としてマーク 星 睦美 2014年6月26日 4:14