zoukankan      html  css  js  c++  java
  • 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[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群:

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

  • 相关阅读:
    【POJ 2778】DNA Sequence
    【POJ 2923】Relocation
    codeforces 475D
    hdu4742
    hdu4741
    hdu5016
    poj3929
    Codeforces Round #267 (Div. 2)
    codeforces 455E
    hdu4073 Lights
  • 原文地址:https://www.cnblogs.com/BeiJing-Net-DaiDai/p/3620537.html
Copyright © 2011-2022 走看看