三.使用基于轮询的SQL缓存依赖
    ASP.NET2.0新增了一个功能非常强大的SQL缓存依赖功能。该功能允许在指定的数据库中发生数据更改时,自动地重新从数据库中载入数据。
    在使用基于轮询的缓存依赖之前,必须执行下面两个步骤的配置:
    (1)必须对数据库及其中的若干个数据表启用SQL缓存依赖;
    (2)必须在Web.config配置文件中配置SQL缓存依赖。
1.配置数据库
(1)对数据库启用SQL缓存依赖
F:">aspnet_regsql -E -S . -ed -d Northwind
为 SQL 缓存依赖项启用该数据库。
.
已完成。
F:">
或者:
F:">aspnet_regsql -C "data source=.;initial catalog=Test;integrated security=ssp
i" -ed
为 SQL 缓存依赖项启用该数据库。
.
已完成。
F:">
(2)对数据表启用SQL缓存依赖
F:">aspnet_regsql -E -S . -ed -d Northwind -et -t Categories
为 SQL 缓存依赖项启用该数据库。
.
已完成。
为 SQL 缓存依赖项启用该表。
已完成。
F:">
或者:
F:">aspnet_regsql -C "data source=.;initial catalog=Test;integrated security=ssp
i" -et -t Categories
为 SQL 缓存依赖项启用该数据库。
.
已完成。
为 SQL 缓存依赖项启用该表。
已完成。
F:">
2.配置Web.config配置文件
    <system.web>
        <caching>
            <sqlCacheDependencyenabled="true"pollTime="5000">
                <databases>
                    <addname="Northwind"
                         connectionStringName="NorthwindConnectionString"/>
                </databases>
            </sqlCacheDependency>
        </caching>
    </system.web>
3.对页面输出缓存使用基于轮询的SQL缓存依赖
    PollingSqlOutputCache.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile=" PollingSqlOutputCache.aspx.cs" Inherits="PollingSqlOutputCache" %>
<%@ OutputCache Duration="999999" VaryByParam="none" SqlDependency="Northwind:Categories" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>对页面输出缓存使用基于轮询的SQL缓存依赖</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="CategoryID"
            DataSourceID="SqlDataSource1">
            <Columns>
                <asp:BoundField DataField="CategoryID" HeaderText="CategoryID" InsertVisible="False"
                    ReadOnly="True" SortExpression="CategoryID" />
                <asp:BoundField DataField="CategoryName" HeaderText="CategoryName" SortExpression="CategoryName" />
                <asp:BoundField DataField="Description" HeaderText="Description" SortExpression="Description" />
            </Columns>
        </asp:GridView>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server"
            ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
            SelectCommand="SELECT [CategoryID], [CategoryName], [Description] FROM [Categories]">
        </asp:SqlDataSource>
    </div>
    </form>
</body>
</html>
4.对DataSource缓存使用基于轮询的SQL缓存依赖
    PollingDataSourceCache.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile=" PollingDataSourceCache.aspx.cs" Inherits="PollingDataSourceCache" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>DataSource缓存使用基于轮询的SQL缓存依赖</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="CategoryID"
            DataSourceID="SqlDataSource1">
            <Columns>
                <asp:BoundField DataField="CategoryID" HeaderText="CategoryID" InsertVisible="False"
                    ReadOnly="True" SortExpression="CategoryID" />
                <asp:BoundField DataField="CategoryName" HeaderText="CategoryName" SortExpression="CategoryName" />
                <asp:BoundField DataField="Description" HeaderText="Description" SortExpression="Description" />
            </Columns>
        </asp:GridView>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server"
            ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
            EnableCaching="true"
            SqlCacheDependency="Northwind:Categories"
            SelectCommand="SELECT [CategoryID], [CategoryName], [Description] FROM [Categories]">
        </asp:SqlDataSource>   
    </div>
    </form>
</body>
</html>
5.对数据缓存使用基于轮询的SQL缓存依赖
    PollingDataCache.aspx
    略……
    PollingDataCache.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Web.Configuration;
using System.Web.Caching;
public partial class PollingDataCache : System.Web.UI.Page
{
    private DataTable GetCategories()
    {
        string strConn =
            WebConfigurationManager.
            ConnectionStrings["NorthwindConnectionString"].
            ConnectionString;
        string strSql = "select CategoryID,CategoryName from Categories";
        SqlConnection cn = new SqlConnection(strConn);
        SqlDataAdapter da =
            new SqlDataAdapter(strSql, cn);
        DataTable dt = new DataTable();
        da.Fill(dt);
        return dt;
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        DataTable dt = (DataTable)Cache["Category"];
        if (dt == null)
        {
            dt = GetCategories();
            SqlCacheDependency dep =
                new SqlCacheDependency("Northwind", "Categories");
            Cache.Insert("Category", dt, dep);
        }
        GridView1.DataSource = dt;
        GridView1.DataBind();
    }
}

 
缓存应用程序页面和数据(三)
四.使用基于通知的SQL缓存依赖
优点:ASP.NET应用程序不必定时地访问数据库以查看是否有数据的修改。
缺点(限制):
l         查询必须使用两部分的表名(例如:dbo.Northwind)
l         查询必须包含一个显式的列名列表(不能使用*)
l         查询不能引用视图、继承表、临时表或表变量
l         查询不能引用大对象类型,如text、ntext、p_w_picpath列等
l         查询不能包含子查询、外连接等
l         查询不能使用distinct、compute、compute by或者insert关键字
l         查询不能使用聚合函数
可以对推SQL缓存依赖使用存储过程,但是,每一个存储过程中的SELECT语句必须满足上述的条件。
    第一步:配置数据库启用SQL Server2005 Service Broker。
    第二步:配置应用程序开始监听通知。
1.为推SQL缓存依赖配置数据库
    (1)执行下面的查询来检查Service Broker是否已经为特定的数据库激活:
SELECT name,is_broker_enabled FROM sys.databases
    (2)如果没有开启,则执行alter database命令来启用它:
ALTER DATABASE Northwind SET ENABLE_BROKER
    (3)最后,ASP.NET进程必须有足够的权限来订阅查询通知。
GRANT SUBSCRIBE QUERY NOTIFICATIONS TO "COMPUTENAME"ASPNET"
2.为推SQL缓存依赖配置应用程序
在应用程序可以接收到变更通知之前,必须启用查询通知监听器。在Global.asax文件中启用监听器。
Global.asa
<%@ Application Language="C#" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Web.Configuration" %>
<script runat="server">
    void Application_Start(object sender, EventArgs e)
    {
        string strConn =
            WebConfigurationManager.
            ConnectionStrings["TestConnectionString"].
            ConnectionString;
        SqlDependency.Start(strConn);
    }
   
    void Application_End(object sender, EventArgs e)
    {
        string strConn =
            WebConfigurationManager.
            ConnectionStrings["TestConnectionString"].
            ConnectionString;
        SqlDependency.Stop(strConn);
    }
       
    void Application_Error(object sender, EventArgs e)
    {
    }
    void Session_Start(object sender, EventArgs e)
    {
    }
    void Session_End(object sender, EventArgs e)
    {
    }      
</script>