針對不頻繁變動的資料 (如類別、字典表),將 DataSet 存入 System.Web.Caching.Cache 可大幅減少資料庫查詢與序列化開銷。本文示範 GridView 綁定快取資料的完整模式。
using System.Data.SqlClient;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack) BindData();
}
private void BindData()
{
if (Cache["CategoriesCache"] == null)
{
using (var con = new SqlConnection(
"Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|NORTHWND.MDF;Integrated Security=True;User Instance=True"))
using (var ad = new SqlDataAdapter("SELECT * FROM Categories", con))
{
var ds = new DataSet();
ad.Fill(ds);
// 快取 2 分鐘,絕對過期
Cache.Insert("CategoriesCache", ds, null,
DateTime.Now.AddMinutes(2), TimeSpan.Zero);
GridView1.DataSource = ds;
}
}
else
{
GridView1.DataSource = (DataSet)Cache["CategoriesCache"];
}
GridView1.DataBind();
}
| 參數 | 說明 |
|---|---|
| key | 快取鍵值,用於後續查找 |
| value | 要快取的物件 (此處為 DataSet) |
| dependencies | 檔案/快取鍵依賴,變更時自動失效,無則 null |
| absoluteExpiration | 絕對過期時間 (建議用 DateTime.UtcNow 避免夏令時問題) |
| slidingExpiration | 滑動過期間隔,TimeSpan.Zero 表示不使用滑動過期 |
以上範例採用 絕對過期 2 分鐘,適合資料極少變動場景。若需資料變更即時失效,可結合 SqlCacheDependency (SQL Server 2005+) 或自訂依賴項。
"Categories:All"、"Product:{id}"。Cache.Remove(key) 或 Cache[key] = newData。