WPF非轮询方式更新数据库变化SqlDependency(数据库修改前台自动更新)
上一章节我们讲到wpf的柱状图组件,它包含了非轮询方式更新数据库变化SqlDependency的内容,但是没有详细解释,现在给大家一个比较简单的例子来说明这部分内容。
上一章节:
WPF柱状图(支持数据库动态更新)
效果图请加群查看,在群共享里面。
在使用SqlDependency之前需要先开启sql server的SQL Server Service Broker服务,用来通知数据变化的服务,命令如下:
alter database 数据库名称 set enable_broker
如果执行成功则执行下列语句,1为开启,0未开启:
select IS_BROKER_ENABLED from master.sys.databases
where name='数据库名称'
如果一直在执行的过程中那就重启一下sql server服务,如SQL EXPRESS.
第一种方式
代码如下:
private string label11; //这个相当于一个介质 在用组件的时候有依赖属性作为绑定项 就不需要这个 这里只是一个简单的demo 所以用这个
public string Label11
{
get { return label11; }
set { label11 = value; }
}
//监听数据库的值变化
void OnDependencyChange(object sender, SqlNotificationEventArgs e)
{
GetTable();
}
private static string con = "data source=.;initial catalog=ColumnSeriesDB;uid=sa;pwd=sa;";
string lal;
//这个如果有依赖属性就不需要这个 这个是监听属性值的变化
protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
{
base.OnPropertyChanged(e);
if (lal != null)
if (Label11 != lal)
GetTable();
lal = Label11;
}
private void GetTable()
{
this.Dispatcher.Invoke(new System.Action(() =>
{
SqlConnection sqlCon = new SqlConnection(con);
//需要监控的数据内容
SqlCommand cmd = new SqlCommand("SELECT MinData FROM ColumnSeriesData", sqlCon);
cmd.CommandType = CommandType.Text;
sqlCon.Open();
SqlDependency dep = new SqlDependency(cmd);
//数据库的值发生变化时触发该事件
dep.OnChange += new OnChangeEventHandler(OnDependencyChange);
SqlDataReader reader = cmd.ExecuteReader();
List<string> ls = new List<string>();
while (reader.Read())
{
ls.Add(reader["MinData"].ToString());
}
Label11 = ls[].ToString();
reader.Close();
//wpf 值的绑定
Binding ToolTipNameBind = new Binding { Source = this, Path = new PropertyPath("Label11") };
BindingOperations.SetBinding(this.label1, Label.ContentProperty, ToolTipNameBind);
}));
}
private void Window_Loaded_1(object sender, RoutedEventArgs e)
{
SqlDependency.Start(con); //开启监听
GetTable();
}
第二种方式 关于在组件开发时的SqlDependency使用代码如下:
public static DependencyProperty Label11Property = DependencyProperty.Register("Label11", typeof(string), typeof(MainWindow)); //定义一个依赖项属性 依赖与Label11 两者为同一个值 第一个参数是要依赖的属性 第二个为类型 第三个为当前的类或窗体名称
public string Label11
{
get { return (string)GetValue(Label11Property); }
set { SetValue(Label11Property, value); }
}
void OnDependencyChange(object sender, SqlNotificationEventArgs e)
{
GetTable();
}
private static string con = "data source=.;initial catalog=ColumnSeriesDB;uid=sa;pwd=sa;";
//这里就不需要这些了 之前是没有使用依赖属性 数据库的数据变化之后 在这里无法变化 需要监听属性的值 当使用依赖属性之后 两者的值是依赖关系 绑定之后可自动变化
//string lal;
//protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
//{
// base.OnPropertyChanged(e);
// if (lal != null)
// if (Label11 != lal)
// GetTable();
// lal = Label11;
//}
private void GetTable()
{
this.Dispatcher.Invoke(new System.Action(() =>
{
SqlConnection sqlCon = new SqlConnection(con);
SqlCommand cmd = new SqlCommand("SELECT MinData FROM ColumnSeriesData", sqlCon);
cmd.CommandType = CommandType.Text;
sqlCon.Open();
SqlDependency dep = new SqlDependency(cmd);
dep.OnChange += new OnChangeEventHandler(OnDependencyChange);
SqlDataReader reader = cmd.ExecuteReader();
List<string> ls = new List<string>();
while (reader.Read())
{
ls.Add(reader["MinData"].ToString());
}
Label11 = ls[].ToString();
reader.Close();
Binding ToolTipNameBind = new Binding { Source = this, Path = new PropertyPath("Label11") };
BindingOperations.SetBinding(this.label1, Label.ContentProperty, ToolTipNameBind);
}));
}
private void Window_Loaded_1(object sender, RoutedEventArgs e)
{
SqlDependency.Start(con);
GetTable();
}
关于两种方式的不同 :
第一种方式 比如在连接数据库的时候 如需要远程连接数据库 在开发组件的时候是不可能将数据库的名称、登录名、密码等信息写到组件里面的,因为这些不是从数据库中读取的 就使用不到SqlDependency了 , 所以 在将组件加载到设计器 或者设计平台的时候 数据库名称 数据库登录名 密码等 是不能用依赖属性直接绑定的 ,就需要这种方式去手动绑定,当修改了数据库的名称等信息的时候触发OnPropertyChanged事件 去重新根据修改的数据库名称去登录数据库获取数据。
第二种方式只限于在数据库中读取数据。第一种方式比较灵活 可以自己去做想要的属性,让它动态显示。
在这方面有更好的方案欢迎交流。
我们的群:94234450
点击加入QQ群:
不论你遇到什么问题,我们绝不会让你独自去面对!
WPF非轮询方式更新数据库变化SqlDependency(数据库修改前台自动更新)的更多相关文章
- 负载均衡算法,轮询方式 大话设计模式之工厂模式 C#
负载均衡算法,轮询方式 2018-04-13 17:37 by 天才卧龙, 13 阅读, 0 评论, 收藏, 编辑 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现 ...
- CPU处理多任务——中断与轮询方式比较
中断方式与轮询方式比较 中断的基本概念 程序中断通常简称中断,是指CPU在正常运行程序的过程中,由于预选安排或发生了各种随机的内部或外部事件,使CPU中断正在运行的程序,而转到为相应的服务程序去处 ...
- S5PV210 串口配置与实验(轮询方式)
S5PV210 UART 相关说明 通用异步收发器简称 UART, 即 UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER,它用来传输串行数据.发送数据时, ...
- EF修改model自动更新数据库
最近用MVC+EF学习时遇到修改model后而数据库没更新报错,就在网上找关于数据迁移自动更新数据库的,折腾了大半天终于弄了出来 第一步:在程序包管理器控制台里: Enable-Migrations ...
- mysql设置updatetime字段每次修改时自动更新
我们在数据库表设计阶段中都会加上CreateTime, UpdateTime字段, 在重要业务字段更新的时候,都会重新赋值UpdateTime字段,这个对后期查找分析业务数据变更时非常有用. 但是现在 ...
- 使用mybatis更新数据时 时间字段的值自动更新
1.debug打印出来执行的sql语句发现并没有修改时间的字段,最后发现是设计表时勾选了根据当前时间戳更新..... 去掉该字段的根据当前时间戳更新语句: alter table tableName ...
- polling轮询和comet
comet:(原意:彗星) Comet is a web application model in which a long-held(held:保留) HTTP request allows a w ...
- Web 通信 之 长连接、长轮询(转)
Web 通信 之 长连接.长轮询(long polling) 基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强 ...
- Web 通信 之 长连接、长轮询(long polling)
基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强了程序的实时性和交互性. 一.什么是长连接.长轮询? 用通俗易 ...
随机推荐
- ide远程调试
这篇写得好:http://qifuguang.me/2015/09/18/IntelliJ%E8%BF%9C%E7%A8%8B%E8%B0%83%E8%AF%95%E6%95%99%E7%A8%8B/
- Unity NGUI 图集Atlas制作
unity版本:4.5 NGUI版本:3.6.5 1.选择要制作的图片放到对应目录下,在Asset下新建一个文件夹Picture用于放置图片: 2.选中一张图片,打开Atlas Maker: 3.单击 ...
- Eclipse工具使用技巧总结
首先推荐一篇非常好的How to use eclipse文章 ,讲的是eclipse使用的方方面面,非常实用,推荐给大家! 一.常用快捷键:Ctrl+F11 运行Ctrl+Shift+/ 在代码窗口中 ...
- 【转】git使用教程
Git使用教程 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是 ...
- .net软件自动化测试笔记(API-1)
.net 软件测试自动化之道 API(Application Programming Interface)包括单元测试(Unit Testing),模块测试(Module Testing),组件测试( ...
- PV,UV,IP
参加了DTCC归来之后,各大电商技术大牛都会自豪的分享一下自己公司网站的PV,流量等等.当时也是一知半解,回来之后赶紧查了查,也算是扫扫盲. 以下摘自网络中,自己稍稍做了整理,对于PV,流量和带宽的理 ...
- 【原】1.1RDD源码解读(二)
(6)transformation 操作,通过外在的不同RDD表现形式来达到内部数据的处理过程.这类操作并不会触发作业的执行,也常被称为lazy操作. 大部分操作会生成并返回一个新的RDD,例sort ...
- 删除旧Ambari集群
年少无知,安装了1.2.0版本.开源社区动力太强,更新的吼吼的跟不上啊,升级发生错误,于是就想重装了.在网上找到了一个很好的删除脚本,分享一下.原文链接 http://www.cnblogs.com/ ...
- HW5.16
public class Solution { public static void main(String[] args) { for(int i = 2000; i <= 2010; i++ ...
- 各大算法专题-STL篇
这篇文章着重记录c++中STL的用法.主要粗略的介绍其用法,以知识点的形式呈现其功能,不会深入源码分析其工作原理. 排序和检索. sort(a,a+n),对a[0]往后的n个元素(包括a[0])进行排 ...