一、sqldependency说明
sqlDependency 提供了一种能力:当监测的数据库中的数据发生改变的时候,sqldependency会自动触发onChange事件来通知应用程序,从而达到让系统自动更新数据(或者缓存的)的目的(后期会将其同signalr进行结合,以满足实时响应)
二、sqldependency方法调用(ASP.NET CORE 3.1)
- 首先,将数据库(这里使用的是SQLserver,MySql 好像叫做MySqlDependency 后期再补充)
ALTER DATABASE ShengNong SET NEW_BROKER WITH ROLLBACK IMMEDIATE;(恢复初始设置)
ALTER DATABASE ShengNong SET ENABLE_BROKER;(设置通知服务)
SELECT is_broker_enabled FROM sys.databases WHERE name = 'ShengNong ’ (可以用来查看是否已经开启通知服务)
- 代码实现
在startup.cs中添加一个初始化服务 services.AddHostedService();
在TEST中 添加一个Task 异步任务
调用方法
using System.Data.SqlClient;
public async Task WatchDevice()
{
await Task.Run(()=> {
useSqlDependency();
});
}
启用 SqlDependency.Start(conStr)来开启间监听
public void useSqlDependency() {
string conStr = AppSetting.DbConnectionString; // 在应用程序启动时运行的代码
SqlDependency.Start(conStr);//启动监听服务,ps:只需启动一次
_StockService.GetFourWayBusMessage();
}
在服务关闭的时候要及时关闭监控
public Task StopAsync(CancellationToken cancellationToken)
{
string conStr = AppSetting.DbConnectionString; // 在应用程序启动时运行的代码
SqlDependency.Stop(conStr);//启动监听服务,ps:只需启动一次
return Task.CompletedTask;
}
通过SQL语句进行监控
注意 :这里必须使用规范的SQL语句,而且查询的字段不可以用*代替。这个SQL的含义就是要监控该表的相应字段,当该字段发生改变的时候执行onchange,其余字段发生改变的时候不发生该改变
/// <summary>
/// 实时监控库存日志变化
/// </summary>
/// <returns></returns>
public DataTable GetFourWayBusMessage()
{
string strSQL = "select C_Code,C_IsHaveGoods,C_CurrentRow,C_CurrentLayer,C_CurrentColumn,C_TaskNum,C_Status from [dbo].[T_Device_FourWayBus] ";
SqlDataAdapter da = new SqlDataAdapter(strSQL, AppSetting.DbConnectionString);
SqlDependency dep = new SqlDependency(da.SelectCommand);
dep.OnChange += new OnChangeEventHandler(dep_OnFourWayBusChange);
DataTable tbl = new DataTable();
da.Fill(tbl);
return tbl;
}
private void dep_OnFourWayBusChange(object sender, SqlNotificationEventArgs e)
{
if (e.Type == SqlNotificationType.Change) //只有数据发生变化时,才重新获取并数据
{
var tbl = GetFourWayBusMessage();
}
}
这样一个简单的sqldependency使用就完成了
宝剑锋从磨砺出,梅花香自苦寒来。