天天看點

關于ASP.NET緩存與資料庫中的資料表關聯查詢

我們可以在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() 方法即可,我就不多解釋了。好了,基本就這樣了功能算是實作了

轉載于:https://www.cnblogs.com/pca-nana/archive/2011/12/19/2293636.html