您的位置:首页 > 编程语言 > ASP

关于ASP.NET缓存与数据库中的数据表关联查询

2011-12-19 17:17 253 查看


我们可以在ASP.NET使用缓存技术,例如数据库中表RoleInfo,如果该表没有发生变化(这里包括修改,删除,添加),则网页读取内存中的缓存项,显示到界面上。如果对表进行了操作,则自动移除缓存项,直接连接数据库查询数据并显示到界面上。我简单的演示一下,抛砖引玉吧!


原理是:首先通知数据库中的一张表(例如RoleInfo)生成一张缓存表并且自动生成触发器。当RoleInfo发生修改时,触发触发器,数据库中的缓存表会发生变化,缓存会自动移除。


我的页面有个按钮,按钮的作用是添加缓存依赖。还有个数据控件,用来显示数据。代码如下


protected void Button1_Click(object sender, EventArgs e)
{
//如果没有缓存
if (Page.Cache["key"]==null)
{
//自定义的数据操作类
DALProvider dal = new DALProvider();
//创建数据集 这里可能有点多此一举哈。。
dal.CreateDataSet("RoleInfo");
DataSet ds = dal.ProviderData;
//根据连接字符串和表名通知该数据库的表实行缓存依赖通知
//EnableTableForNotifications是静态方法,有两个重载方法
//第一个参数为数据库的连接字符串,第二个参数为缓存所依赖的数据库表名
SqlCacheDependencyAdmin.EnableTableForNotifications(dal.ConStr, "RoleInfo");
//通过web配置文件读取ZitOCS需要的连接字符串,并指明数据集中与缓存依赖的表
//第一个参数为web节点指定链接字符串,第二个参数为数据集中与缓存依赖的DataTable
SqlCacheDependency sqlCache = new SqlCacheDependency("ZitOCS","RoleInfo");
//插入缓存。第一个参数为缓存名称,第二个为数据源,第三个为依赖实例
Page.Cache.Insert("key", ds, sqlCache);
}
}


web.config中需要配置节点

<?xml version="1.0"?>
<configuration>
<appSettings/>
<connectionStrings>
<add name="ZitOCSConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\ZitOCS.mdf;Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.web>
<caching>
<sqlCacheDependency enabled="true" pollTime="10000">
<databases>
<add name="ZitOCS" connectionStringName="ZitOCSConnectionString"/>
</databases>
</sqlCacheDependency>
</caching>

//sqlCacheDependency节点的属性 enabled表示开启缓存 pollTime表示每隔一段时间向数据库轮询,一旦有了变化就移除缓存项


读取缓存就非常简单了,把代码贴出来

protected void ReadFromSource()
{
if (Cache["key"]==null)
{
DALProvider dal = new DALProvider();
dal.CreateDataSet("RoleInfo");
DataSet ds = dal.ProviderData;
this.GridView1.DataSource = ds;
this.GridView1.DataBind();
}
else
{
DataSet ds = (DataSet)Cache["key"];
this.GridView1.DataSource = ds;
this.GridView1.DataBind();
}
}

//一个数据提供类

public class DALProvider
{
private DataSet ds = new DataSet();
private readonly string conStr = ConfigurationManager.ConnectionStrings["ZitOCSConnectionString"].ConnectionString;

public string ConStr
{
get { return conStr; }
}

private readonly string sqlStr;
public DataSet ProviderData {
get
{
if (ds.Tables.Count==0)
{
return null;
}
return ds;
}
}
//默认查询字符串
public DALProvider()
{
this.sqlStr = "select * from RoleInfo";
}
//自定义查询字符串
public DALProvider(string sqlStr)
{
this.sqlStr = sqlStr;
}
//创建数据集
public void CreateDataSet(string TableName)
{
SqlDataAdapter da = new SqlDataAdapter(sqlStr, conStr);
da.Fill(ds, TableName);
}
}


最后在网页加载的时候调用ReadFromSource() 方法即可,我就不多解释了。好了,基本就这样了功能算是实现了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: