Asp.net 2.0 提供了一个新的数据缓存功能,就是利用sql server2005 的异步通知功能来实现缓存
这里我做一个小小的demo来演示一下这个功能.
1.首先在sqlserver2005 中创建一个test的数据库.添加一个 employee的数据库表.
1
CREATE TABLE [dbo].[employee](
2
[id] [int] IDENTITY(1,1) NOT NULL,
3
[name] [varchar](50)
4
)
5
CREATE TABLE [dbo].[employee](2
[id] [int] IDENTITY(1,1) NOT NULL,3
[name] [varchar](50) 4
) 5

2使用 vs2005 创建一个新的asp.net项目.
web.config如下
1
<?xml version="1.0"?>
2
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
3
<appSettings/>
4
<connectionStrings>
5
<add name="mySource" connectionString="Data Source=.\sql2005;Initial Catalog=test;Persist Security Info=True;User ID=sa;Password=sasa" providerName="System.Data.SqlClient"></add>
6
</connectionStrings>
7
<system.web>
8
<compilation debug="true"/>
9
<authentication mode="Windows"/>
10
</system.web>
11
</configuration>
12
添加一个global.asax文件代码如下
<?xml version="1.0"?>2
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">3
<appSettings/>4
<connectionStrings>5
<add name="mySource" connectionString="Data Source=.\sql2005;Initial Catalog=test;Persist Security Info=True;User ID=sa;Password=sasa" providerName="System.Data.SqlClient"></add>6
</connectionStrings>7
<system.web>8
<compilation debug="true"/>9
<authentication mode="Windows"/>10
</system.web>11
</configuration>12

<%@ Application Language="C#" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="server">
void Application_Start(object sender, EventArgs e)
{
string connStr=ConfigurationManager.ConnectionStrings["mySource"].ConnectionString;
SqlDependency.Start(connStr);
}
void Application_End(object sender, EventArgs e)
{
string connStr = ConfigurationManager.ConnectionStrings["mySource"].ConnectionString;
SqlDependency.Stop(connStr);
}
</script>
3.写访问数据库类代码
1
using System;
2
using System.Data;
3
using System.Data.SqlClient;
4
using System.Configuration;
5
using System.Data.Common;
6
using System.Web;
7
using System.Web.Caching;
8
using System.Web.Security;
9
using System.Web.UI;
10
using System.Web.UI.WebControls;
11
using System.Web.UI.WebControls.WebParts;
12
using System.Web.UI.HtmlControls;
13
14
/// <summary>
15
/// EmployeeData 的摘要说明
16
/// </summary>
17
public class EmployeeData
18
{
19
public EmployeeData()
20
{
21
}
22
23
private HttpContext context;
24
25
public DataSet GetCacheData()
26
{
27
context = HttpContext.Current;
28
DataSet cache =(DataSet) context.Cache["employee"];
29
if (cache == null)
30
{
31
return GetData();
32
}
33
else
34
{
35
return cache;
36
}
37
}
38
39
40
public DataSet GetData()
41
{
42
string connStr = ConfigurationManager.ConnectionStrings["mySource"].ConnectionString;
43
SqlConnection conn = new SqlConnection(connStr);
44
SqlDataAdapter adp = new SqlDataAdapter("select id,name from dbo.employee", conn);
45
SqlCacheDependency dep = new SqlCacheDependency(adp.SelectCommand);
46
DataSet ds=new DataSet();
47
adp.Fill(ds);
48
context.Cache.Add("employee", ds, dep, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Default, new CacheItemRemovedCallback(this.DataDiff));
49
return ds;
50
}
51
52
public void DataDiff(string key, object value, CacheItemRemovedReason reason)
53
{
54
Console.WriteLine("key:" + key);
55
GetData();
56
}
57
58
}
59
using System;2
using System.Data;3
using System.Data.SqlClient;4
using System.Configuration;5
using System.Data.Common;6
using System.Web;7
using System.Web.Caching;8
using System.Web.Security;9
using System.Web.UI;10
using System.Web.UI.WebControls;11
using System.Web.UI.WebControls.WebParts;12
using System.Web.UI.HtmlControls;13

14
/// <summary>15
/// EmployeeData 的摘要说明16
/// </summary>17
public class EmployeeData18
{19
public EmployeeData()20
{21
}22

23
private HttpContext context;24

25
public DataSet GetCacheData()26
{27
context = HttpContext.Current;28
DataSet cache =(DataSet) context.Cache["employee"];29
if (cache == null)30
{31
return GetData();32
}33
else34
{35
return cache;36
}37
}38

39

40
public DataSet GetData()41
{42
string connStr = ConfigurationManager.ConnectionStrings["mySource"].ConnectionString;43
SqlConnection conn = new SqlConnection(connStr);44
SqlDataAdapter adp = new SqlDataAdapter("select id,name from dbo.employee", conn);45
SqlCacheDependency dep = new SqlCacheDependency(adp.SelectCommand);46
DataSet ds=new DataSet();47
adp.Fill(ds);48
context.Cache.Add("employee", ds, dep, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Default, new CacheItemRemovedCallback(this.DataDiff));49
return ds;50
}51

52
public void DataDiff(string key, object value, CacheItemRemovedReason reason)53
{54
Console.WriteLine("key:" + key);55
GetData();56
}57

58
}59

值得注意的是sql语句的写法,不能是 select * ,必须一个字段一个字段的写,表名签加架构前缀 如这里是 dbo.employee
4.创建一个asp.net页面,页面代码如下.
1
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
2
3
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4
5
<html xmlns="http://www.w3.org/1999/xhtml" >
6
<head runat="server">
7
<title>无标题页</title>
8
</head>
9
<body>
10
<form id="form1" runat="server">
11
<div>
12
<asp:GridView ID="GridView1" runat="server" >
13
</asp:GridView>
14
</div>
15
</form>
16
</body>
17
</html>
18
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>2

3
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">4

5
<html xmlns="http://www.w3.org/1999/xhtml" >6
<head runat="server">7
<title>无标题页</title>8
</head>9
<body>10
<form id="form1" runat="server">11
<div>12
<asp:GridView ID="GridView1" runat="server" >13
</asp:GridView>14
</div>15
</form>16
</body>17
</html>18

5.接着写数据绑定代码.
1
using System;
2
using System.Data;
3
using System.Configuration;
4
using System.Web.Caching;
5
using System.Data.SqlClient;
6
using System.Web;
7
using System.Web.Security;
8
using System.Web.UI;
9
using System.Web.UI.WebControls;
10
using System.Web.UI.WebControls.WebParts;
11
using System.Web.UI.HtmlControls;
12
13
public partial class _Default : System.Web.UI.Page
14
{
15
protected void Page_Load(object sender, EventArgs e)
16
{
17
EmployeeData em=new EmployeeData();
18
GridView1.DataSource = em.GetCacheData();
19
GridView1.DataBind();
20
}
21
22
}
23
using System;2
using System.Data;3
using System.Configuration;4
using System.Web.Caching;5
using System.Data.SqlClient;6
using System.Web;7
using System.Web.Security;8
using System.Web.UI;9
using System.Web.UI.WebControls;10
using System.Web.UI.WebControls.WebParts;11
using System.Web.UI.HtmlControls;12

13
public partial class _Default : System.Web.UI.Page 14
{15
protected void Page_Load(object sender, EventArgs e)16
{17
EmployeeData em=new EmployeeData();18
GridView1.DataSource = em.GetCacheData();19
GridView1.DataBind();20
}21

22
}23

好这样代码就完成了,有兴趣的朋友可以测试一下.通过这种方式做缓存,只要数据库发生改变,那么缓存将被清空.
将数据重新读入到缓存中.这样再次刷新时,数据将从缓存中读取.

浙公网安备 33010602011771号