系列目录:

SqlDependency缓存用法

Asp.net使用SqlDependency

SqlCacheDependency使用命令通知使缓存无效

CacheDependency用法

AggregateCacheDependency 用法

SqlCacheDependency使用轮流检测技术(轮询)使缓存无效

----------------------------------------------------------------------------------------------

 

Asp.net使用与在Winform中用法基本相同。请看下边代码。


web页面不像winFrom会自动变更页面内容。所以需要自己手动刷新页面。下例中将取出的资料缓存起来,然后在每次刷新时重新绑定。



using System.Data;

using System.Configuration;

using System.Data.SqlClient;


namespace SqlDependencyInAspNet

{

    public partial class _Default : System.Web.UI.Page

    {

        string connectionString = ConfigurationManager.ConnectionStrings["NHibernateSampleDb"].ToString();

        protected void Page_Load(object sender, EventArgs e)

        {

            if (!IsPostBack)

            {

                SqlDependency.Start(connectionString);

                if (Cache["TableDate"] == null)

                {

                    GetData();

                }

                DataTable dt = (DataTable)Cache["TableDate"];

                gvData.DataSource = dt;

                gvData.DataBind();

            }

        }


        /// <summary>

        /// 得到资料

        /// </summary>

        private void GetData()

        {

            using (SqlConnection cn = new SqlConnection(connectionString))

            {

                using (SqlCommand cmd=cn.CreateCommand())

                {

                    cn.Open();

                    cmd.CommandText = "select [CustomerId],[Firstname],[Lastname],[Version] from [dbo].[Customer]";

                    SqlDependency dep = new SqlDependency(cmd);

                    //当有DML操作时,onChange事件会接收来自Sql Server通过sq_DispatcherProc存储过程发送给应用程序的消息。

                    dep.OnChange += new OnChangeEventHandler(dep_OnChange);

                    DataTable dt = new DataTable();

                    using (SqlDataReader rdr = cmd.ExecuteReader())

                    {

                        dt.Load(rdr);

                    }

                    Cache["TableDate"] = dt;

                }

            }

        }


        /// <summary>

        /// 当有异动时,接收资料并缓存起来。

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        void dep_OnChange(object sender, SqlNotificationEventArgs e)

        {

            /*

             当取数据时间长时,有可能数据未取完,窗口就初关闭.所以先删除Cahce,在取数据。

             */

            Cache.Remove("Cache");

            GetData();


        }

    }

}


 

在Global.asax的Application_End事件中终止通信。代码如下。



        protected void Application_End(object sender, EventArgs e)

        {

            SqlDependency.Stop(System.Configuration.ConfigurationManager.ConnectionStrings["NHibernateSampleDb"].ToString());

        }


 

 测试,修改数据库,然后刷新Web页面。页面会从缓存中取出数据。