C# 启用数据库通知刷新(SqlDependency)

‌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等行集函数。

数据库监听异常

  1. 启动应用程序,第一次打开时,通过 SQL Profiler 可以监视到向数据库发出的 SQL 命令。
  2. 第二次打开页面时,通过 SQL Profiler 可以监视到未向数据库发出的 SQL 命令,此时数据从缓存中读出。
  3. 修改数据库对应表中的数据。
  4. 第三次打开页面时,数据仍是第一次打开时的数据,通过 SQL Profiler 可以监视到未向数据库发出的 SQL 命令。

解决方法

  1. 打开 Microsoft SQL Server Management Studio。
  2. 右击数据库节点,选择“属性”。
  3. 选择“文件”页,在所有者中设置正确的账号
posted @ 2024-12-02 14:51  panbin_2006  阅读(267)  评论(0)    收藏  举报