我正在使用下面的代碼來緩存「People」表的「Name」列的變化依賴性。但是,如果其他列(如「地址」列)發生更改,則連續觸發並清除緩存。 (ASP.NET 4.0和SQL Server 2008中)SqlCacheDependency/SqlDependency和列
public string GetTheVals()
{
string vals = HttpContext.Current.Cache["TheCacheKey__X"] as string;
if (vals == null)
{
con = GetConnection();
SqlCommand cmd = new SqlCommand(@"
SELECT Name
FROM dbo.People
", con);
con.Open();
SqlCacheDependency sqlDependency = new SqlCacheDependency(cmd);
SqlDataReader rdr = null;
StringBuilder builder = new StringBuilder("");
rdr = cmd.ExecuteReader();
while (rdr.Read())
{
builder.Append(rdr[0].ToString());
}
vals = builder.ToString();
HttpContext.Current.Cache.Insert("TheCacheKey__X", vals, sqlDependency, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(20));
CloseConnection(con);
}
return vals;
}
它爲什麼會火的時候,改雖說列的值,它是不是在命令的查詢時,結果改變了被解僱?
您也可以爲OnChange事件分配一個委託,當相關命令的結果發生變化時將會觸發 。
這也需要國家明確列,所以我們明白,它會過濾掉表的其他列,也不會觸發。
- 那麼,爲什麼它需要明確指定列名?
- 它只是爲了讓開發人員意識到他們在做什麼(例如在使用內部連接時)並避免創建會導致最差性能的依賴關係?
在SELECT語句中的預計列必須明確 陳述,和表的名稱前面必須有兩個部分組成的名稱加以限定。注意 這意味着聲明中引用的所有表必須位於 相同的數據庫中。
該聲明可能不會使用星號(*)或table_name。*語法指定 列。
該語句不得包含子查詢,外連接或自連接。
http://msdn.microsoft.com/en-us/library/ms181122(v=sql.105).aspx