C# 数据库主动通知查询变更

SqlDependency 非常适用于使用缓存的情况,在这种情况下您的 ASP.NET 应用程序或中间层服务需要将某些信息缓存在内存中。SqlDependency 允许您在数据库中的原始数据发生更改时接收通知,以便刷新缓存。

若要建立依赖项,需要将一个 SqlDependency 对象与一个或多个 SqlCommand 对象关联。要接收通知,需要订阅 OnChange 事件。

SqlDependency 被设计为用在 ASP.NET 或中间层服务中,这里对数据库有活动依赖项的服务器的数量相对较少。它不应用在客户端应用程序中,因为其中可能有成百上千个客户端计算机将为单个数据库服务器建立 SqlDependency 对象。

我们以SQL Server 2005 SQL Server 2008为例实现SqlDependency机制

注意:依赖是基于某一张表的,而且查询语句只能是简单查询语句,不能带top*,同时必须指定所有者,即类似[dbo].[Users]

实现:

SQL Server 2005上执行 ALTER DATABASE <DatabaseName> SET ENABLE_BROKER; 语句让相应的数据库启用监听服务,以便支持SqlDependency特性。如果执行以上指令,很长时间都没有完成,请断开该数据库所有连接再执行.

实例代码

C#代码

namespace Sov.ConsoleApp   

{   

    class Program   

    {   

        public static string connectionstring = "data source=(local);initial catalog=RBAC;user id=sov;password=sov123;Asynchronous Processing=true;MultipleActiveResultSets=true;Integrated Security=True";   

  

        /// <summary>   

        /// 查询并监听   

        /// </summary>   

        public void DoSqlDependency()   

        {   

            using (SqlConnection conn = new SqlConnection(connectionstring))   

            {   

                string sql = "SELECT userID,Username,Password FROM dbo.[Users] WHERE UserID='1'";   

  

                SqlCommand cmd = new SqlCommand(sql, conn);   

  

                //清除   

                cmd.Notification = null;   

  

                //设置通知   

                SqlDependency dep = new SqlDependency(cmd);   

  

                //通知事件   

                dep.OnChange += new OnChangeEventHandler(SqlDependency_OnChange);   

  

  

                conn.Open();   

  

                SqlDataReader sdr = cmd.ExecuteReader();   

  

                Console.WriteLine("======================");   

                while (sdr.Read())   

                {   

                    Console.WriteLine(sdr[0].ToString() + "|" + sdr[1].ToString() + "|" + sdr[2].ToString());   

                }   

                sdr.Close();   

                conn.Close();   

            }   

        }   

  

        /// <summary>   

        /// 通知事件   

        /// </summary>   

        void SqlDependency_OnChange(object sender, SqlNotificationEventArgs args)   

        {   

            Console.WriteLine("======================");   

            Console.WriteLine("Event Recd");   

            Console.WriteLine("Info:" + args.Info);   

            Console.WriteLine("Source:" + args.Source);   

            Console.WriteLine("Type:" + args.Type);   

  

            SqlDependency dep = (SqlDependency)sender;   

            dep.OnChange -= SqlDependency_OnChange;   

  

            //通知之后,当前Dependency失效,重新获取数据并设置通知   

            DoSqlDependency();   

        }   

  

        static void Main(string[] args)   

        {   

            try  

            {   

                SqlClientPermission perm = new SqlClientPermission(   

                    System.Security.Permissions.PermissionState.Unrestricted);   

                perm.Demand();   

            }   

            catch  

            {   

                throw new ApplicationException("No permission");   

            }   

  

            try  

            {   

                //客户端开始监听   

                SqlDependency.Start(connectionstring);   

  

                Program q = new Program();   

                q.DoSqlDependency();   

                Console.WriteLine("Wait for Notification Event...");   

  

  

                Console.Read();   

            }   

            finally  

            {   

                //清理依赖   

                SqlDependency.Stop(connectionstring);   

            }               

        }           

    }   

}  

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值