在 ADO.NET 中,IDataReader 提供唯讀、順向的資料流存取,適合大量資料讀取;DataSet 則將資料載入記憶體,適合小量資料與離線操作。當資料筆數超過 200 筆(視硬體而定),IDataReader 的效能優勢明顯。
若連線中斷、例外拋出或未正確關閉,IDataReader 可能導致資料庫連線池洩漏。.NET 限制連線池大小(WinApp 約 21、Web 更少),洩漏會迅速耗盡可用連線。
透過委托模式,將 IDataReader 的使用封裝於 using 區塊,確保自動釋放:
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);
}
}
}
}
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)
DBComponent.GetAuthor("172-32-1176", new DBComponent.IDataReaderHandler(BindGrid));
}
private void BindGrid(IDataReader reader)
{
DataGrid1.DataSource = reader;
DataGrid1.DataBind();
}
}
此模式確保 SqlDataReader 與 SqlConnection 於委托執行完畢後自動關閉,有效避免資源洩漏。