WPF非轮询方式更新数据库变化SqlDependency(数据库修改前台自动更新)
2014-03-24 11:52
357 查看
上一章节我们讲到wpf的柱状图组件,它包含了非轮询方式更新数据库变化SqlDependency的内容,但是没有详细解释,现在给大家一个比较简单的例子来说明这部分内容。
上一章节:
在使用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.
第一种方式
代码如下:
第二种方式 关于在组件开发时的SqlDependency使用代码如下:
关于两种方式的不同 :
第一种方式 比如在连接数据库的时候 如需要远程连接数据库 在开发组件的时候是不可能将数据库的名称、登录名、密码等信息写到组件里面的,因为这些不是从数据库中读取的 就使用不到SqlDependency了 , 所以 在将组件加载到设计器 或者设计平台的时候 数据库名称 数据库登录名 密码等 是不能用依赖属性直接绑定的 ,就需要这种方式去手动绑定,当修改了数据库的名称等信息的时候触发OnPropertyChanged事件 去重新根据修改的数据库名称去登录数据库获取数据。
第二种方式只限于在数据库中读取数据。第一种方式比较灵活 可以自己去做想要的属性,让它动态显示。
在这方面有更好的方案欢迎交流。
我们的群:94234450
点击加入QQ群:
不论你遇到什么问题,我们绝不会让你独自去面对!
上一章节:
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[0].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[0].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
- WPF非轮询方式实时更新数据库变化SqlDependency
- sqlDependency提供了这样一种能力:当被监测的数据库中的数据发生变化时,SqlDependency会自动触发OnChange事件来通知应用程序,从而达到让系统自动更新数据(或缓存)的目的.
- sqlDependency监控数据库数据变化,自动通知
- C# 利用FTP自动下载xml文件后利用 FileSystemWatcher 监控目录下文件变化并自动更新数据库
- Silverlight Xap包、配置文件修改后不能自动更新问题处理方式总结
- WPF学习日志1---DataGrid绑定与修改更新(数据List & 数据库)[部分代码有摘录其他文章]
- sqlDependency监控数据库数据变化,自动通知
- 玩转SSH--Hibernate(三)---手动修改数据库,前台查询信息不同步更新问题解决方法
- sqlDependency监控数据库数据变化,自动通知
- thinkphp 在数据库更新(save)的时候,如果字段没有被修改,会更新失败 和数据的自动验证,插入的时候可以自动验证,但更新的时候就不能验证了
- 对于分页时,若数据库的数据不断更新,不让前台显示脏数据(同一条数据重复显示)的处理方式
- wpf学习笔记 NotifyPropertyChanged实现数据变化自动更新UI
- EF修改model自动更新数据库
- WPF DataGrid 自动生成行号的方法(通过修改RowHeaderTemplate的方式)
- Win8如何修改图片缺省打开方式不让其自动跳转照片应用中
- WPF用流的方式上传/显示/下载图片文件(保存在数据库)
- 高并发网站更新数据库数据比较高效的方式
- WPF线程中被修改后DataGrid数据不能及时更新的问题
- 转载文章:Windows Azure 七月份更新:SQL 数据库、流量管理器、自动伸缩、虚拟机