WPF非轮询方式实时更新数据库变化SqlDependency
2014-03-14 23:07
1056 查看
(1)启用当前数据库的 SQL Server Service Broker alter database 数据库名称 set enable_broker 若命令执行成功的话,验证一下,执行下面SQL语句 select IS_BROKER_ENABLED from master.sys.databases where name='数据库名称' 值为1表示开启,为0表示未开启 (2)后台代码 public partial class Page1 : Page { private
sta
(1)启用当前数据库的 SQL Server Service Broker
alter database 数据库名称 set enable_broker
若命令执行成功的话,验证一下,执行下面SQL语句
select IS_BROKER_ENABLED from master.sys.databases
where name='数据库名称'
值为1表示开启,为0表示未开启
(2)后台代码
public partial class Page1 : Page
{
private static string connStr;
SqlDataReader sdr;
public Page1()
{
InitializeComponent();
connStr = 数据库连接字符串
SqlDependency.Start(connStr);//传入连接字符串,启动基于数据库的监听
UpdateUI();
}
private void UpdateUI()
{
using (SqlConnection connection = new SqlConnection(connStr))
{
//依赖是基于某一张表的,而且查询语句只能是简单查询语句,不能带top或*,同时必须指定所有者,即类似[dbo].[]
//获取要监控的数据内容,这里只监控一条数据
using (SqlCommand command = new SqlCommand("select ID,UserID,[Message] From [dbo].[Messages] where ID=2", connection))
{
command.CommandType = CommandType.Text;
connection.Open();
SqlDependency dependency = new SqlDependency(command);
//当后台数据库发生变化时,触发该事件
dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
sdr = command.ExecuteReader();
while (sdr.Read())
{
//线程安全,使用Dispatch线程更新界面
DispatchUpdateUI(sdr);
}
sdr.Close();
}
}
}
private void DispatchUpdateUI(SqlDataReader sdr)
{
try
{
tbxUserID.Dispatcher.Invoke(new UpdatetbxUserDelegate(UpdatetbxUserIDAction));
tbxMessage.Dispatcher.Invoke(new UpdatetbxMessageDelegate(UpdatetbxMessageAction));
}
catch (Exception ex)
{
throw ex;
}
}
private delegate void UpdatetbxUserDelegate();
private delegate void UpdatetbxMessageDelegate();
private void UpdatetbxUserIDAction()
{
tbxUserID.Text = sdr["UserID"].ToString();
}
private void UpdatetbxMessageAction()
{
tbxMessage.Text = sdr["Message"].ToString();
}
private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
UpdateUI();
}
}
DataReader始终和数据库连接,当检测数据发生变化时,触发OnChange 事件,编写后台逻辑,获取数据库的本地副本,这里使用数据绑定(ObservableCollection<T>)发现无法实时更新到客户端,有待继续研究,暂时采用了手动刷新界面的方式,涉及到了Dispatch UI线程。
本文来自挑战的博客,原文地址:http://www.cnblogs.com/leep2007/archive/2012/11/26/2789628.html
sta
(1)启用当前数据库的 SQL Server Service Broker
alter database 数据库名称 set enable_broker
若命令执行成功的话,验证一下,执行下面SQL语句
select IS_BROKER_ENABLED from master.sys.databases
where name='数据库名称'
值为1表示开启,为0表示未开启
(2)后台代码
public partial class Page1 : Page
{
private static string connStr;
SqlDataReader sdr;
public Page1()
{
InitializeComponent();
connStr = 数据库连接字符串
SqlDependency.Start(connStr);//传入连接字符串,启动基于数据库的监听
UpdateUI();
}
private void UpdateUI()
{
using (SqlConnection connection = new SqlConnection(connStr))
{
//依赖是基于某一张表的,而且查询语句只能是简单查询语句,不能带top或*,同时必须指定所有者,即类似[dbo].[]
//获取要监控的数据内容,这里只监控一条数据
using (SqlCommand command = new SqlCommand("select ID,UserID,[Message] From [dbo].[Messages] where ID=2", connection))
{
command.CommandType = CommandType.Text;
connection.Open();
SqlDependency dependency = new SqlDependency(command);
//当后台数据库发生变化时,触发该事件
dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
sdr = command.ExecuteReader();
while (sdr.Read())
{
//线程安全,使用Dispatch线程更新界面
DispatchUpdateUI(sdr);
}
sdr.Close();
}
}
}
private void DispatchUpdateUI(SqlDataReader sdr)
{
try
{
tbxUserID.Dispatcher.Invoke(new UpdatetbxUserDelegate(UpdatetbxUserIDAction));
tbxMessage.Dispatcher.Invoke(new UpdatetbxMessageDelegate(UpdatetbxMessageAction));
}
catch (Exception ex)
{
throw ex;
}
}
private delegate void UpdatetbxUserDelegate();
private delegate void UpdatetbxMessageDelegate();
private void UpdatetbxUserIDAction()
{
tbxUserID.Text = sdr["UserID"].ToString();
}
private void UpdatetbxMessageAction()
{
tbxMessage.Text = sdr["Message"].ToString();
}
private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
UpdateUI();
}
}
DataReader始终和数据库连接,当检测数据发生变化时,触发OnChange 事件,编写后台逻辑,获取数据库的本地副本,这里使用数据绑定(ObservableCollection<T>)发现无法实时更新到客户端,有待继续研究,暂时采用了手动刷新界面的方式,涉及到了Dispatch UI线程。
本文来自挑战的博客,原文地址:http://www.cnblogs.com/leep2007/archive/2012/11/26/2789628.html
相关文章推荐
- WPF非轮询方式实时更新数据库变化SqlDependency
- WPF非轮询方式更新数据库变化SqlDependency(数据库修改前台自动更新)
- 数据库发生变化实时更新前端页面
- sqlDependency提供了这样一种能力:当被监测的数据库中的数据发生变化时,SqlDependency会自动触发OnChange事件来通知应用程序,从而达到让系统自动更新数据(或缓存)的目的.
- sqlDependency监控数据库数据变化,自动通知
- C#中数据库的更新和删除记录的两种实现方式
- 使用DataSet Datatable 更新数据库的三种方式
- php+mysqli使用面向对象方式更新数据库实例
- 使用广播实时更新网络状态变化
- ThinkPHP3.2.3---mysql+ajax实现长连接,实时监测数据库数据是否更新
- 高并发网站更新数据库数据比较高效的方式
- C# 实时监控数据库SqlDependency
- 使用DataSet Datatable 更新数据库的三种方式及DataTable不同状态的取值
- 使用SignalR实时推送数据库变化--车辆实时跟踪
- ASP.NET MVC3 COMET SQLDependency 监视数据库表变化
- ViewPager嵌套Fragment实现item实时更新的两种方式
- 不用锁表,没有异常:在高并发网络中高效的更新数据库数据的方式
- 游戏中实时更新数据的实现方式
- 新手求教!!PB在DW中更新数据库的方式中,直接右击选择Delete Row 可以吗?与在数据库中操作有什么区别?
- 当数据库某张表数据发生变化时,更新c#程序中缓存的用法