wpf 轮询mysql数据库_WPF非轮询方式更新数据库变化SqlDependency(数据库修改前台自动更新)...

本文介绍如何在WPF应用中通过非轮询方式,利用SqlDependency监听MySQL数据库变化,实现数据更新。内容包括开启SQL Server Service Broker服务、设置依赖以及两种不同的实现方式,适用于实时展示数据库更新的场景。
摘要由CSDN通过智能技术生成

上一章节我们讲到wpf的柱状图组件,它包含了非轮询方式更新数据库变化SqlDependency的内容,但是没有详细解释,现在给大家一个比较简单的例子来说明这部分内容。

上一章节:

效果图请加群查看,在群共享里面。

在使用SqlDependency之前需要先开启sql server的SQL Server Service Broker服务,用来通知数据变化的服务,命令如下:

alterdatabase数据库名称 set enable_broker

如果执行成功则执行下列语句,1为开启,0未开启:

selectIS_BROKER_ENABLED frommaster.sys.databases

wherename='数据库名称'

如果一直在执行的过程中那就重启一下sql server服务,如SQL EXPRESS.

第一种方式

代码如下:

private string label11; //这个相当于一个介质 在用组件的时候有依赖属性作为绑定项 就不需要这个 这里只是一个简单的demo 所以用这个

public stringLabel11

{get { returnlabel11; }set { label11 =value; }

}//监听数据库的值变化

void OnDependencyChange(objectsender, SqlNotificationEventArgs e)

{

GetTable();

}private static string con = "data source=.;initial catalog=ColumnSeriesDB;uid=sa;pwd=sa;";stringlal;//这个如果有依赖属性就不需要这个 这个是监听属性值的变化

protected override voidOnPropertyChanged(DependencyPropertyChangedEventArgs e)

{base.OnPropertyChanged(e);if (lal != null)if (Label11 !=lal)

GetTable();

lal=Label11;

}private voidGetTable()

{this.Dispatcher.Invoke(new System.Action(() =>{

SqlConnection sqlCon= newSqlConnection(con);//需要监控的数据内容

SqlCommand cmd = new SqlCommand("SELECT MinData FROM ColumnSeriesData", sqlCon);

cmd.CommandType=CommandType.Text;

sqlCon.Open();

SqlDependency dep= newSqlDependency(cmd);//数据库的值发生变化时触发该事件

dep.OnChange += newOnChangeEventHandler(OnDependencyChange);

SqlDataReader reader=cmd.ExecuteReader();

List ls = new List();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(objectsender, RoutedEventArgs e)

{

SqlDependency.Start(con);//开启监听

GetTable();

}

第二种方式   关于在组件开发时的SqlDependency使用代码如下:

public static DependencyProperty Label11Property = DependencyProperty.Register("Label11", typeof(string), typeof(MainWindow)); //定义一个依赖项属性 依赖与Label11 两者为同一个值 第一个参数是要依赖的属性 第二个为类型 第三个为当前的类或窗体名称

public stringLabel11

{get { return (string)GetValue(Label11Property); }set{ SetValue(Label11Property, value); }

}void OnDependencyChange(objectsender, 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 voidGetTable()

{this.Dispatcher.Invoke(new System.Action(() =>{

SqlConnection sqlCon= newSqlConnection(con);

SqlCommand cmd= new SqlCommand("SELECT MinData FROM ColumnSeriesData", sqlCon);

cmd.CommandType=CommandType.Text;

sqlCon.Open();

SqlDependency dep= newSqlDependency(cmd);

dep.OnChange+= newOnChangeEventHandler(OnDependencyChange);

SqlDataReader reader=cmd.ExecuteReader();

List ls = new List();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(objectsender, RoutedEventArgs e)

{

SqlDependency.Start(con);

GetTable();

}

关于两种方式的不同 :

第一种方式   比如在连接数据库的时候    如需要远程连接数据库   在开发组件的时候是不可能将数据库的名称、登录名、密码等信息写到组件里面的,因为这些不是从数据库中读取的    就使用不到SqlDependency了 , 所以 在将组件加载到设计器  或者设计平台的时候  数据库名称  数据库登录名   密码等 是不能用依赖属性直接绑定的  ,就需要这种方式去手动绑定,当修改了数据库的名称等信息的时候触发OnPropertyChanged事件  去重新根据修改的数据库名称去登录数据库获取数据。

第二种方式只限于在数据库中读取数据。第一种方式比较灵活   可以自己去做想要的属性,让它动态显示。

在这方面有更好的方案欢迎交流。

我们的群:94234450

点击加入QQ群:5508e1104cbff4c908f74cb5c7711b6f.png

不论你遇到什么问题,我们绝不会让你独自去面对!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值