[ASP.NET] 談return datareader and connection close
DataReader在讀取資料的程式碼撰寫中很常用到,而我們都知道當DataReader使用結束後
,應該進行.Dispose(),且Connection也應該進行Close(),因此一般情況下程式碼大致會是
這個樣子的
- 以GridView Bind Data為例,以using對connection做資源管理
{
using (SqlCommand command = new SqlCommand())
{
command.Connection = conn;
command.Connection.Open();
command.CommandText = @"select EmployeeID,LastName from Employees ";
IDataReader idr = command.ExecuteReader();
this.GridView1.DataSource = idr;
this.GridView1.DataBind();
idr.Dispose();
}
}
但如果我們想要設計成一個具回傳DataReader的共用Method時,此時就無法在該Method
裡直接把Connection給Close(),因為DataReader必須在Connection是Open的情況才能運行
,但Connection資源是寶貴的,在設計上不能不對它進行Close處理。以下藉由二個程式
碼示範,來做個比較
- 模擬10次外界的呼叫且不對Connection進行Close處理
{
for (int i = 0; i < 10; i++)
{
this.GridView1.DataSource = GetData();
this.GridView1.DataBind();
}
}
private IDataReader GetData()
{
SqlConnection conn = new SqlConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["NorthwindDBconnStr"].ToString());
using (SqlCommand command = new SqlCommand())
{
command.Connection = conn;
command.Connection.Open();
command.CommandText = @"select EmployeeID,LastName from Employees ";
IDataReader idr = command.ExecuteReader();
return idr;
}
}
- 模擬10次外界的呼叫搭配CommandBehavior.CloseConnection,對連線資源進行處理
{
for (int i = 0; i < 10; i++)
{
this.GridView1.DataSource = GetData2();
this.GridView1.DataBind();
}
}
private IDataReader GetData2()
{
SqlConnection conn = new SqlConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["NorthwindDBconnStr"].ToString());
using (SqlCommand command = new SqlCommand())
{
command.Connection = conn;
command.Connection.Open();
command.CommandText = @"select EmployeeID,LastName from Employees ";
IDataReader idr = command.ExecuteReader(CommandBehavior.CloseConnection);
return idr;
}
}
結果可以發現第二種方式,在連線數上是有效進行管理,而第一種方式使得連
線資源不斷被Create起來,這對效能來說不是件好事。而我們處理的手法很簡單
只需要在ExecuteReader時給予CommandBehavior.CloseConnection就可以了。所以有
類似設計的共用Method,別忘了要特別注意Connection的處理囉
Ref:
若本文對您有所幫助,歡迎轉貼,但請在加註【轉貼】及來源出處,並在附上本篇的超連結,感恩您的配合囉。
By No.18