2008-02-18

玩玩asp.net 2.0的caching系列二 - RemoveOutputCacheItem

在asp時代,要作cache通常是用application來存資料,
要完整一點的.就是自己寫個class來操作application控制要cache的資料.

但是在asp.net,頁面要cache變得簡單許多.
只要一行

<%@ OutputCache Duration="60" VaryByParam="None" %>

就可以了,
但是,現在問題又來了,
客戶希望後台新增完後他要立即可以從前台看到更新的資料.
先前在網路上看到是有說只要頁面有修改outputcache就會被清除.
但是...這是在測試時候的方式,
在production環境的頁面應該是不能讓客戶每次更新完就去動一下頁面.
要解決這問題,
可以使用HttpResponse.RemoveOutputCacheItem
用法如下 :

HttpResponse.RemoveOutputCacheItem("/default.aspx");

假設你的default.aspx有設定了outputcache,那你可以新增一個管理cache的頁面.
在那個頁面上有個按鈕,點下後呼叫上面的程式.
而RemoveOutputCacheItem所帶的參數就是你的頁面的絕對路徑(不能使用"../"這種相對路徑).

測試網址:

OutputCache頁面 : http://vip.blueshop.com.tw/ajun/cachetest.aspx
Cache管理頁面 : http://vip.blueshop.com.tw/ajun/cachemanager.aspx

outputCache頁面在上一篇介紹過了,而管理的頁面中有兩個功能,
remove cache才是這次的測試範例.

只要確定網址正確,按下remove cache後,該頁面的outputcache就會被清除,
再次瀏覽outputcache的頁面後就會是被更新後的資料了.

問題到這大致上已經ok了,
但是...還是有點狀況,
因為後台維護的資料是最新消息,
而除了首頁外,還有其他的頁面也都會顯示最新消息,
所以如果要用RemoveOutputCacheItem一筆一筆清除cache似乎有點麻煩,
所以下一篇將會是說明怎麼處理這樣的問題.
ps.範例中有這個的程式碼,如果等不及想要知道解決方案的話,可以直接看code.

範例下載:
http://ajunlee.googlepages.com/CacheTest.rar

玩玩asp.net 2.0的caching系列一 - OutputCache與Substitution

作網站的首頁的時候,通常為了增加效能,都會作一些cache的動作,
而在asp.net中,要作將網頁作cache很簡單,
如果要cache整個頁面,只要在aspx中加上下面這段

<%@ OutputCache Duration="60" VaryByParam="None" %>

這樣可以讓你的頁面cache 60秒.
如果你的網址如下

ShowCity.aspx?city=101

也就是會因為參數不同而有不同結果,而你也希望能快取這些頁面,
那就將設定改為

<%@ OutputCache Duration="60" VaryByParam="city" %>

如果有多個參數的話,那就以分號(;)區隔就可以了,例如

<%@ OutputCache Duration="60" VaryByParam="city;zipcode" %>

可是現在問題來了.
如果首頁都是公開的資料那也就沒有甚麼問題,
但是現在首頁要放個登入者的名稱,
讓使用者知道自己已經登入,而且知道自己叫甚麼名字.
而整頁作outputcache的話,一連到網頁可能會看到別人的名字...
一開始,是用ajax的方式,在也面呈現以後,
透過javascript去呼叫一隻aspx取得登入資料,然後顯示在某個div裡面.

但後來發現asp.net 2.0中有個Substitution的控制項可以解決這樣的問題,

而Substitution 的用法如下:

aspx

<asp:Substitution ID="Substitution1" runat="server" MethodName="GetDateTime" />

aspx.cs

public static string GetDateTime(HttpContext context)
{
    return "主機時間 : " + DateTime.Now.ToString();
}

範例網址 : http://vip.blueshop.com.tw/ajun/cachetest.aspx

點選上面的範例網址,然後重新整理幾次,
你會發現上面的主機時間60秒才會更新.
但下面的主機時間是每次都會更新.

 

參考網址:
http://dotnetjunkies.com/QuickStartv20/aspnet/doc/ctrlref/standard/substitution.aspx

範例下載:
http://ajunlee.googlepages.com/CacheTest.rar

2008-02-01

取得MS SQL中資料欄位的描述內容

用ado.net的connection.GetSchema取得資料表結構算是蠻方便的.
但差的一點就是取不到欄位的說明.
因為又要開始寫文件了.而之前寫的SchemaGen不能支援MS SQL 2005.
所以現在正在著手寫SchemaGen 2005版.
另外也練習使用所謂的design pattern來進行...
至於用哪個...先試試看再說...

回到主題.
之前其實有寫過相關的主題.
不過當初主要是說明用T-SQL維護欄位的描述.
現在再針對::fn_listextendedproperty加一些說明

如果要針對某個資料表的某個欄位取得
可以使用下面的語法

select value form ::fn_listextendedproperty(NULL, 'user', 'dbo', 'table', N'資料表名稱', 'column', N'欄位名稱')

如果要取得某個資料表中所有欄位說明的話,可以使用

select * form ::fn_listextendedproperty(NULL, 'user', 'dbo', 'table', N'資料表名稱', 'column',NULL)

另外.如果你的資料表也有設定說明的話,
可以使用下面的語法取得資料表的說明

select * form ::fn_listextendedproperty(NULL, 'user', 'dbo', 'table', N'資料表名稱',NULL,NULL)

當然.要取的所有資料表的說明就是用下面這個

select * form ::fn_listextendedproperty(NULL, 'user', 'dbo', 'table',NULL,NULL,NULL)

另外,上面的參數中有使用NULL的,也可以改用default.意義應該是相同的.例如

select * form ::fn_listextendedproperty(default, 'user', 'dbo', 'table',default,default,default)

而修改或是新增欄位或是資料表說明的話,
可以參考上次寫的T-SQL維護欄位的描述,
使用sp_addextendedproperty及sp_updateextendedproperty來處理

 

相關連結 :

fn_listextendedproperty (Transact-SQL)
http://msdn2.microsoft.com/en-us/library/ms179853.aspx

sp_addextendedproperty (Transact-SQL)
http://msdn2.microsoft.com/en-us/library/ms180047.aspx

sp_updateextendedproperty (Transact-SQL)
http://technet.microsoft.com/zh-tw/library/ms186885.aspx

Google以後可以查祖譜嗎?

今天看到一篇INDISE的文章 : 比爾蓋茲和賈伯斯,他們的孩子都是 14 歲才能用手機 想說比爾蓋茲不是有點年紀了嗎? 他的小孩應該也都不小了. 他們14歲時應該還沒有甚麼智慧手機吧… 說不定還是在BB call的年代. 所以就好奇的用google查一下有沒...