在method A中使用SqlDataReader後,可以將SqlDataReader關閉(close),來加速回收此物件的速度。可是,在method B中的SqlConnection就沒有辦法做close了。
當然我們不能在離開B時就把SqlConnection就close掉,因為在method B中執行SqlCommand.ExecuteReader時,並不是一次就把所有的result set都放進SqlDataReader中,而是以stream的方式透過SqlConnection傳進來。所以如果先把SqlConnection關了,SqlDataReader也就讀不到資料了。若是SqlConnection不關閉,又會在一段時間中佔用database connection與相關資源。
後來在網路上找到了這一篇
http://codes.codedigest.com/CodeDigest/164-Implicitly-Closing-the-Connection-object-when-SqlDataReader-is-returned-from-a-Function.aspx
特別注意到這一行
SqlDataReader myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
如果在ExecuteReader加入參數CommandBehavior.CloseConnection,則當對SqlDataReader進行close時,也會將其底層的SqlConnection也關掉。這樣,就可以適時地把SqlConnection關閉,儘早釋放出資源。這對尤其是server-side的系統來說,相當重要。