使用ASP.NET Cache 的 CacheDependency 來偵測資料庫是否變更
小弟前陣子在討論區看到此篇文章...經過測試後有小小心得..分享給大家呀...
首先準備下列檔案:
CacheDependencyDataAdd.aspx,CacheDependencyDataAdd.aspx.cs→做資料更新網頁
CacheDependencyDemo.aspx,CacheDependencyDemo.aspx.cs→做資料瀏覽網頁
CheckChange.txt→檢查資料是否有更改的文字檔(內容空的)
--------------------------------------------------------------------------------------------------------------------------------
CacheDependencyDemo.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="CacheDependencyDemo.aspx.cs" Inherits="CacheDependencyDemo" %>
<!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>CacheDependencyDemo</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
</div>
</form>
</body>
</html>
<!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>CacheDependencyDemo</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
</div>
</form>
</body>
</html>
CacheDependencyDemo.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.Web.Caching;
using System.Data.SqlClient;
public partial class CacheDependencyDemo : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Cache["data"] == null)
{
DataTable dt = GetData();
//增加一個檢查資料是否有更改的文字檔
CacheDependency file = new CacheDependency(Server.MapPath("CheckChange.txt"));
Cache.Insert("data", dt, file, DateTime.MaxValue, TimeSpan.FromMinutes(10));
this.GridView1.DataSource = dt;
this.GridView1.DataBind();
Response.Write("no Cache");
}
else
{
DataTable dt = (DataTable)Cache["data"];
this.GridView1.DataSource = dt;
this.GridView1.DataBind();
Response.Write("use Cache");
}
}
//取得資料
protected DataTable GetData()
{
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
string queryString = "SELECT * FROM [user]";
SqlCommand cmd = new SqlCommand(queryString, conn);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
adapter.Fill(dt);
return dt;
}
}
}
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.Web.Caching;
using System.Data.SqlClient;
public partial class CacheDependencyDemo : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Cache["data"] == null)
{
DataTable dt = GetData();
//增加一個檢查資料是否有更改的文字檔
CacheDependency file = new CacheDependency(Server.MapPath("CheckChange.txt"));
Cache.Insert("data", dt, file, DateTime.MaxValue, TimeSpan.FromMinutes(10));
this.GridView1.DataSource = dt;
this.GridView1.DataBind();
Response.Write("no Cache");
}
else
{
DataTable dt = (DataTable)Cache["data"];
this.GridView1.DataSource = dt;
this.GridView1.DataBind();
Response.Write("use Cache");
}
}
//取得資料
protected DataTable GetData()
{
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
string queryString = "SELECT * FROM [user]";
SqlCommand cmd = new SqlCommand(queryString, conn);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
adapter.Fill(dt);
return dt;
}
}
}
CacheDependencyDataAdd.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="CacheDependencyDataAdd.aspx.cs" Inherits="CacheDependencyDataAdd" %>
<!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>CacheDependencyDataAdd</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="id"
DataSourceID="SqlDataSource1" OnRowUpdated="GridView1_RowUpdated">
<Columns>
<asp:CommandField ShowEditButton="True" />
<asp:BoundField DataField="id" HeaderText="id" InsertVisible="False" ReadOnly="True"
SortExpression="id" />
<asp:BoundField DataField="name" HeaderText="name" SortExpression="name" />
<asp:BoundField DataField="tel" HeaderText="tel" SortExpression="tel" />
<asp:BoundField DataField="gender" HeaderText="gender" SortExpression="gender" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
SelectCommand="SELECT * FROM [user]" UpdateCommand="UPDATE [user] SET name = @name, tel = @tel, gender = @gender WHERE (id = @id)">
<UpdateParameters>
<asp:Parameter Name="name" />
<asp:Parameter Name="tel" />
<asp:Parameter Name="gender" />
</UpdateParameters>
</asp:SqlDataSource>
</div>
</form>
</body>
</html>
<!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>CacheDependencyDataAdd</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="id"
DataSourceID="SqlDataSource1" OnRowUpdated="GridView1_RowUpdated">
<Columns>
<asp:CommandField ShowEditButton="True" />
<asp:BoundField DataField="id" HeaderText="id" InsertVisible="False" ReadOnly="True"
SortExpression="id" />
<asp:BoundField DataField="name" HeaderText="name" SortExpression="name" />
<asp:BoundField DataField="tel" HeaderText="tel" SortExpression="tel" />
<asp:BoundField DataField="gender" HeaderText="gender" SortExpression="gender" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
SelectCommand="SELECT * FROM [user]" UpdateCommand="UPDATE [user] SET name = @name, tel = @tel, gender = @gender WHERE (id = @id)">
<UpdateParameters>
<asp:Parameter Name="name" />
<asp:Parameter Name="tel" />
<asp:Parameter Name="gender" />
</UpdateParameters>
</asp:SqlDataSource>
</div>
</form>
</body>
</html>
CacheDependencyDataAdd.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.IO;
public partial class CacheDependencyDataAdd : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void GridView1_RowUpdated(object sender, GridViewUpdatedEventArgs e)
{
//資料有更新時,將檢查資料是否有更改的文字檔,做更新動作,如果沒做此動作資料不會馬上更新
using (System.IO.StreamWriter StreamWriter1 = new StreamWriter(Server.MapPath("CheckChange.txt")))
{
//寫入一串文字,讓文字檔有異動過
StreamWriter1.WriteLine(DateTime.Now.ToString());
}
}
}
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.IO;
public partial class CacheDependencyDataAdd : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void GridView1_RowUpdated(object sender, GridViewUpdatedEventArgs e)
{
//資料有更新時,將檢查資料是否有更改的文字檔,做更新動作,如果沒做此動作資料不會馬上更新
using (System.IO.StreamWriter StreamWriter1 = new StreamWriter(Server.MapPath("CheckChange.txt")))
{
//寫入一串文字,讓文字檔有異動過
StreamWriter1.WriteLine(DateTime.Now.ToString());
}
}
}
執行如果:
CacheDependencyDemo
CacheDependencyDataAdd
參考網址:
http://www.blueshop.com.tw/board/show.asp?subcde=BRD20080402082116KNJ&fumcde=FUM20041006161839LRJ
http://aspnet.4guysfromrolla.com/articles/121802-1.aspx