在ADO(+)數據訪問的時候,MS曾經在其出版的書籍中強調過(有可靠證據),盡量不要使用使用DataSet訪問對象,而是使用IDataReader這個只讀的向前的記錄集訪問,的確,這是有一定的道理的,DataSet是把數據集先置於內存中,然後告訴緩存起來,斷開連接,IDataReader是直接讀取的.
在數據量較少的情況下,DataSet和IDataReader的優劣並沒有非常明顯的優劣,然而,當數據流量達到一定量(200條左右),這和您的計算機的硬件配置有關,IDataReader的優勢就很明朗了.
在訪問數據量較多的時候,如果您熱衷於使用IDataReader讀取數據庫,那麼,以下的一個問題是很明顯的,如果線路阻塞,記錄異常關閉,線路突然中止,這時候就數據庫服務器中閒置了一條任何程序都無法再利於的線程-資源洩漏了.曾經,可以時候Close關閉鏈接池的,但,難道要每次DataBind完畢了操作這個麼?如果DataBind失敗,而您又使用了Catch語句,那這個線路又閒置了.根據本人的經驗,在WinApp的開發中,.Net所限制的線路最大的pool是21,在Web開發中,更少,4條抑或更少.
這裡介紹一種方法,使用Delegates關閉,使用委托的優勢就是自動關閉,每次完畢,自動激發這個委托.
public class DBComponent{
public delegate void IDataReaderHandler(IDataReader reader);
public static void GetAuthor(string authorID,IDataReaderHandler handler){
using(SqlConnection conn=new SqlConnection("server=.;Trusted_Connection=True;DATABASE=pubs")){
SqlCommand command=new SqlCommand("select * from class where [id]=@ID",conn);
command.Parameters.AddWithValue("@ID",authorID);
conn.Open();
using(SqlDataReader rdr=command.ExecuteReader(CommandBehavior.CloseConnection)){
handler(rdr);
}
}
}
}
注意到handler(rdr);這是引發委托的語句.
頁面使用的時候:
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid DataGrid1;
private void Page_Load(object sender, System.EventArgs e){
if(!IsPostBack)
DataComponent.GetAuthor("172-32-1176",new DataComponent.IDataReaderHandler(BindGrid));
}
private void BindGrid(IDataReader reader)
{
DataGrid1.DataSource = reader;
DataGrid1.DataBind();
}
}