主要用在ExecuteReader(c)中,如果想要返回對象前不關閉數據庫連接,須要用CommandBehavior.CloseConnection; CloseConnection解決了流讀取數據模式下,數據庫連接不能有效關閉的情況。當某個XXXDataReader對象在生成時使用了CommandBehavior.CloseConnection,那數據庫連接將在XXXDataReader對象關閉時自動關閉。
由於流模式讀取數據庫的特點,在具體應用時很難確定數據庫連接何時才能被關閉,因為讀取的動作是連續進行的,下面是一個常見的數據訪問層的靜態方法:
/// <summary> /// 常見的獲取SqlDataReader方法 /// 通常的數據訪問層都會提供這個方法 /// </summary> static SqlDataReader GetReader() { //通過連接字符串獲取連接 SqlConnection con = new SqlConnection(conn_String); try { //打開連接,執行查詢,並且返回SqlDataReader con.Open(); SqlCommand cmd = con.CreateCommand(); cmd.CommandText = Sql; SqlDataReader dr = cmd.ExecuteReader(); //SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); return dr; } finally { //這里的代碼處於兩難的境地,如果這里執行關閉:con.Close();那返回的SqlDataReader將毫無用處,因為其依賴的連接已經關閉 //如果這里不執行con.Close();那返回后該連接將永遠無法關閉,因為調用方無法得到連接對象con,無法在調用處執行關閉 } }
正如代碼注釋里描述的那樣,這樣的方法既不能關閉連接,也不能保持連接打開狀態。很多系統為了解決這樣兩難的境地,只能放棄使用Reader模式的數據源,或者把連接對象交給方法調用者,以便進行關閉。
而CommandBehavior.CloseConnection的功能恰好就是為了避免類似的尷尬境地,它能夠保證當SqlDataReader對象被關閉時,其依賴的連接也會被自動關閉CommandBehavior.