SqlDependency 是一种功能,用于在数据库中的数据发生变化时自动触发事件,通知应用程序更新数据或缓存。它适用于ASP.NET和ASP.NET Core应用程序,特别是在需要实时响应数据变化的场景中非常有用。
使用方法
1.启用数据库的通知服务:
首先需要在数据库中启用通知服务。对于SQL Server,可以使用以下SQL命令:
ALTER DATABASE <数据库名> SET NEW_BROKER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE <数据库名> SET ENABLE_BROKER;
可以通过查询sys.databases来确认数据库是否已经开启了通知服务:
SELECT is_broker_enabled FROM sys.databases WHERE name = '<数据库名>';
2.在应用程序中启用SqlDependency:
在应用程序启动时,使用SqlDependency.Start(connectionString)来启动监听服务。例如:
string connectionString = AppSetting.DbConnectionString;
SqlDependency.Start(connectionString);
3.订阅OnChange事件:
在查询时,需要明确指定列名,不能使用*通配符,也不能使用子查询、联接等复杂查询。例如:
using (SqlCommand cmd = new SqlCommand("SELECT column1, column2 FROM table_name", connection))
{SqlDataReader reader = cmd.ExecuteReader();SqlDependency dependency = new SqlDependency(cmd);dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);// 处理数据变化事件
}
限制和注意事项
* 查询语法限制:SELECT语句中的投影列必须明确声明,不能使用或表名.的方式,不能引用视图、计算列、派生表、临时表或表变量等。
* 聚合函数:不能使用AVG、COUNT()、MAX、MIN、STDEV、STDEVP等聚合函数。如果需要使用聚合函数,可以使用GROUP BY表达式,并且选择列表中可以包含COUNT_BIG()或SUM()。
运算符和函数:不能使用PIVOT、UNPIVOT、UNION、INTERSECT、EXCEPT等运算符和函数。
* 大型对象类型:不能引用大型对象类型如text、ntext和image。
* 全文谓词:不能使用CONTAINS或FREETEXT全文谓词。
* 行集函数:不能使用OPENROWSET和OPENQUERY等行集函数。
数据库监听异常
- 启动应用程序,第一次打开时,通过 SQL Profiler 可以监视到向数据库发出的 SQL 命令。
- 第二次打开页面时,通过 SQL Profiler 可以监视到未向数据库发出的 SQL 命令,此时数据从缓存中读出。
- 修改数据库对应表中的数据。
- 第三次打开页面时,数据仍是第一次打开时的数据,通过 SQL Profiler 可以监视到未向数据库发出的 SQL 命令。
解决方法
- 打开 Microsoft SQL Server Management Studio。
- 右击数据库节点,选择“属性”。
- 选择“文件”页,在所有者中设置正确的账号