SqlDependency 非常适用于使用缓存的情况,在这种情况下您的 ASP.NET 应用程序或中间层服务需要将某些信息缓存在内存中。SqlDependency 允许您在数据库中的原始数据发生更改时接收通知,以便刷新缓存。
若要建立依赖项,需要将一个 SqlDependency 对象与一个或多个 SqlCommand 对象关联。要接收通知,需要订阅 OnChange 事件。
SqlDependency 被设计为用在 ASP.NET 或中间层服务中,这里对数据库有活动依赖项的服务器的数量相对较少。它不应用在客户端应用程序中,因为其中可能有成百上千个客户端计算机将为单个数据库服务器建立 SqlDependency 对象。
我们以SQL Server 2005或 SQL Server 2008为例实现SqlDependency机制
注意:依赖是基于某一张表的,而且查询语句只能是简单查询语句,不能带top或*,同时必须指定所有者,即类似[dbo].[Users]
实现:
在SQL Server 2005上执行 ALTER DATABASE <DatabaseName> SET ENABLE_BROKER; 语句让相应的数据库启用监听服务,以便支持SqlDependency特性。如果执行以上指令,很长时间都没有完成,请断开该数据库所有连接再执行.
实例代码:
C#代码
namespace Sov.ConsoleApp
{
class Program
{
public static string connectionstring = "data source=(local);initial catalog=RBAC;user id=sov;password=sov123;Asynchronous Processing=true;MultipleActiveResultSets=true;Integrated Security=True";
/// <summary>
/// 查询并监听
/// </summary>
public void DoSqlDependency()
{
using (SqlConnection conn = new SqlConnection(connectionstring))
{
string sql = "SELECT userID,Username,Password FROM dbo.[Users] WHERE UserID='1'";
SqlCommand cmd = new SqlCommand(sql, conn);
//清除
cmd.Notification = null;
//设置通知
SqlDependency dep = new SqlDependency(cmd);
//通知事件
dep.OnChange += new OnChangeEventHandler(SqlDependency_OnChange);
conn.Open();
SqlDataReader sdr = cmd.ExecuteReader();
Console.WriteLine("======================");
while (sdr.Read())
{
Console.WriteLine(sdr[0].ToString() + "|" + sdr[1].ToString() + "|" + sdr[2].ToString());
}
sdr.Close();
conn.Close();
}
}
/// <summary>
/// 通知事件
/// </summary>
void SqlDependency_OnChange(object sender, SqlNotificationEventArgs args)
{
Console.WriteLine("======================");
Console.WriteLine("Event Recd");
Console.WriteLine("Info:" + args.Info);
Console.WriteLine("Source:" + args.Source);
Console.WriteLine("Type:" + args.Type);
SqlDependency dep = (SqlDependency)sender;
dep.OnChange -= SqlDependency_OnChange;
//通知之后,当前Dependency失效,重新获取数据并设置通知
DoSqlDependency();
}
static void Main(string[] args)
{
try
{
SqlClientPermission perm = new SqlClientPermission(
System.Security.Permissions.PermissionState.Unrestricted);
perm.Demand();
}
catch
{
throw new ApplicationException("No permission");
}
try
{
//客户端开始监听
SqlDependency.Start(connectionstring);
Program q = new Program();
q.DoSqlDependency();
Console.WriteLine("Wait for Notification Event...");
Console.Read();
}
finally
{
//清理依赖
SqlDependency.Stop(connectionstring);
}
}
}
}