您的位置:首页 > 数据库

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐