[ASP.NET] 談return datareader and connection close

  • 4240
  • 0

[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;
        }
    
}

image

 

  • 模擬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;
	}

}

image

 

結果可以發現第二種方式,在連線數上是有效進行管理,而第一種方式使得連

線資源不斷被Create起來,這對效能來說不是件好事。而我們處理的手法很簡單

只需要在ExecuteReader時給予CommandBehavior.CloseConnection就可以了。所以有

類似設計的共用Method,別忘了要特別注意Connection的處理囉微笑

image

 

Ref:

CommandBehavior 列舉型別

 

若本文對您有所幫助,歡迎轉貼,但請在加註【轉貼】及來源出處,並在附上本篇的超連結,感恩您的配合囉。

By No.18