使用数据缓存技术主要原因是为了提高应用程序性能,但在使用数据缓存技术时,需要知道如何
在数据失去原有作用时终止缓存。SqlDependency 对象允许缓存数据,并在修改数据时发出通知。
使用SqlDependency 对象之前需要开启下面的数据库服务。
一、必须在 MSDB 数据库中的 QueryNotificationService 服务上想 Guest 用户授予发送权限。
运行以下代码启动 QueryNotificationService 服务:
USE MSDB
GRANT SEND ON SERVICE::
[http://schemas.microsoft.com/SQL/Notification/QueryNotificationService]
TO GUEST
注:QueryNotificationService 服务的完整 URL 名称是区分大小写的。
二、SqlDependency 对象会使用 Service Broker 将消息发送给 QueryNotificationService
服务,所以需要启用 Service Broker。
运行以下代码启动 Service Broker:
USE Master
ALTER DATABASE Northwind SET ENABLE_BROKER
三、在数据库服务器上启用CLR。
启用 CLR 命令如下:
USE Master
EXEC sp_configure 'clr enabled', 1
RECONFIGURE
使用 SqlDependency 对象
下面是一个简单ASP.NET应用程序, 该应用程序只包含一个 GridView 对象。加载窗体的时候
首先执行 SqlDependency.Start 方法,然后调用 UpdateGrid 方法填充网格控件。如果数据库中
的数据发生变化,则数据库会给应用程序发送一个通知,这时程序就会引发SqlDependency 的
OnChange 事件。
C#
public partial class _Default : System.Web.UI.Page
{
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(
ConfigurationManager.ConnectionStrings["LocalSqlSever"].ConnectionString);
protected void Page_Load(object sender, EventArgs e)
{
SqlDependency.Start(builder.ConnectionString);
UpdateGrid();
}
private void UpdateGrid()
{
using (SqlConnection connection =
new SqlConnection(builder.ConnectionString))
{
using (SqlCommand command =
new SqlCommand("Search", connection))
{
command.CommandType = CommandType.StoredProcedure;
connection.Open();
SqlDependency dependency =
new SqlDependency(command);
dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
GridView1.DataSource = command.ExecuteReader();
GridView1.DataBind();
}
}
}
private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
UpdateGrid();
}
}
}
private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
UpdateGrid();
}
启动该应用程序后,如果运行一个能够改变数据表中数据的程序,如 Microsoft SQL Managerment Studio.
在修改表中数据后,则会发现 GridView 对象会进行相应的更新。