asp.net中SqlDataReader使用時(shí)關(guān)閉數(shù)據(jù)庫(kù)連接的問(wèn)題
廣告:
本文解釋使用SqlDataReader關(guān)閉數(shù)據(jù)庫(kù)連接的問(wèn)題:
例如把數(shù)據(jù)庫(kù)的操作都封裝到了一個(gè)類中,但SqlDataReader只有在讀取完畢時(shí)才能關(guān)閉數(shù)據(jù)庫(kù),這樣類中就不能關(guān)閉書(shū)庫(kù)庫(kù)連接。在函數(shù)中關(guān)閉,如果在函數(shù)中就關(guān)閉了會(huì)提示‘閱讀器關(guān)閉時(shí)Read的嘗試無(wú)效’ .
這點(diǎn)微軟當(dāng)然想到了。用著個(gè)方法dr = Cmd.ExecuteReader(CommandBehavior.CloseConnection);,MSDN中對(duì) CommandBehavior.CloseConnection的解釋是‘在執(zhí)行該命令時(shí),如果關(guān)閉關(guān)聯(lián)的 DataReader 對(duì)象,則關(guān)聯(lián)的 Connection 對(duì)象也將關(guān)閉。’
但。。。。。,請(qǐng)看下面的問(wèn)題:
在函數(shù)中執(zhí)行操作然后返回DataReader,然后在外面讀出數(shù)據(jù),讀取完畢后在外部關(guān)閉DataReader,這樣函數(shù)中的Connetion會(huì)自動(dòng)關(guān)閉嗎?
實(shí)例展示:
我把所有對(duì)數(shù)據(jù)庫(kù)的操作都封裝到了一個(gè)類中,寫(xiě)程序時(shí)就直接調(diào)用這個(gè)類的某個(gè)函數(shù)來(lái)返回結(jié)果。ㄎ覀儗W(xué)習(xí)網(wǎng)-weareleran.net)
下面是一個(gè)用來(lái)返回DataReader對(duì)象的通用類, public SqlDataReader GetReader(string SQL) { SqlConnection Conn; Conn = new SqlConnection(strConn); Conn.Open(); SqlCommand Cmd ; Cmd = CreateCmd(SQL, Conn); SqlDataReader dr; try { dr = Cmd.ExecuteReader(CommandBehavior.CloseConnection); } catch { throw new Exception(SQL); } Cmd.Dispose(); return dr; }
在程序在需要的時(shí)候我就直接構(gòu)造好SQL語(yǔ)句,調(diào)用這個(gè)函數(shù)即可,如下:
string sql="select * form student"; SqlDataReader dr = mydate.GetReader(sql);//調(diào)用數(shù)據(jù)庫(kù)操作通用類中的GetReader函數(shù),返回SqlDataReader if(dr.Read()) { .........讀出數(shù)據(jù),賦值給頁(yè)面控件..... } dr.Close();//操作完畢,關(guān)閉DataReader
我按照這樣的寫(xiě)基本已經(jīng)沒(méi)問(wèn)題了,可以正常讀取出數(shù)據(jù),但是我現(xiàn)在擔(dān)心的一個(gè)問(wèn)題是Connection對(duì)象的關(guān)閉問(wèn)題,因?yàn)槭窃诤瘮?shù)中建立的 Connection對(duì)象,沒(méi)辦法在外部來(lái)關(guān)閉它,又不能在函數(shù)中關(guān)閉,如果在函數(shù)中就關(guān)閉了會(huì)提示‘閱讀器關(guān)閉時(shí)Read的嘗試無(wú)效’
但我在函數(shù)中就用了這一行:dr = Cmd.ExecuteReader(CommandBehavior.CloseConnection);,MSDN中對(duì) CommandBehavior.CloseConnection的解釋是‘在執(zhí)行該命令時(shí),如果關(guān)閉關(guān)聯(lián)的 DataReader 對(duì)象,則關(guān)聯(lián)的 Connection 對(duì)象也將關(guān)閉。’
也就是說(shuō)我在關(guān)閉了DataReader之后,關(guān)聯(lián)的Connection會(huì)自動(dòng)關(guān)閉,我也測(cè)試過(guò),測(cè)試代碼如下:
string strConn = ConfigurationSettings.AppSettings["SqlDatabase"]; SqlConnection cn=new SqlConnection(strConn); cn.Open(); string sql="select * form student"; SqlCommand cm=new SqlCommand(sql,cn); SqlDataReader dr=cm.ExecuteReader(CommandBehavior.CloseConnection); SqlDataReader dr = mydate.RunProcGetReader(sql); if(dr.Read()) { .......讀取數(shù)據(jù) } dr.Close();//關(guān)閉DataReader Response.Write(cn.State);//輸出Connetion的狀態(tài)
結(jié)果運(yùn)行這一段,輸出:Closed ,可見(jiàn)Connetion確實(shí)自動(dòng)關(guān)閉了!但是如我在上面所說(shuō),我的Coonection是在函數(shù)在建立的,在函數(shù)中執(zhí)行操作然后返回 DataReader,然后在外面讀出數(shù)據(jù),讀取完畢后在外部關(guān)閉DataReader,這樣函數(shù)中的Connetion會(huì)自動(dòng)關(guān)閉嗎
我把所有對(duì)數(shù)據(jù)庫(kù)的操作都封裝到了一個(gè)類中,寫(xiě)程序時(shí)就直接調(diào)用這個(gè)類的某個(gè)函數(shù)來(lái)返回結(jié)果!
下面是一個(gè)用來(lái)返回DataReader對(duì)象的通用類,
public SqlDataReader GetReader(string SQL) { SqlConnection Conn; Conn = new SqlConnection(strConn); Conn.Open(); SqlCommand Cmd ; Cmd = CreateCmd(SQL, Conn); SqlDataReader dr; try { dr = Cmd.ExecuteReader(CommandBehavior.CloseConnection); } catch { throw new Exception(SQL); } Cmd.Dispose(); return dr; }
在程序在需要的時(shí)候我就直接構(gòu)造好SQL語(yǔ)句,調(diào)用這個(gè)函數(shù)即可,如下:
string sql="select * form student";
SqlDataReader dr = mydate.GetReader(sql);//調(diào)用數(shù)據(jù)庫(kù)操作通用類中的GetReader函數(shù),返回SqlDataReader
if(dr.Read())
{
.........讀出數(shù)據(jù),賦值給頁(yè)面控件.....
}
dr.Close();//操作完畢,關(guān)閉DataReader
我按照這樣的寫(xiě)基本已經(jīng)沒(méi)問(wèn)題了,可以正常讀取出數(shù)據(jù),但是我現(xiàn)在擔(dān)心的一個(gè)問(wèn)題是Connection對(duì)象的關(guān)閉問(wèn)題,因?yàn)槭窃诤瘮?shù)中建立的 Connection對(duì)象,沒(méi)辦法在外部來(lái)關(guān)閉它,又不能在函數(shù)中關(guān)閉,如果在函數(shù)中就關(guān)閉了會(huì)提示‘閱讀器關(guān)閉時(shí)Read的嘗試無(wú)效’
但我在函數(shù)中就用了這一行:dr = Cmd.ExecuteReader(CommandBehavior.CloseConnection);,MSDN中對(duì) CommandBehavior.CloseConnection的解釋是‘在執(zhí)行該命令時(shí),如果關(guān)閉關(guān)聯(lián)的 DataReader 對(duì)象,則關(guān)聯(lián)的 Connection 對(duì)象也將關(guān)閉。’
也就是說(shuō)我在關(guān)閉了DataReader之后,關(guān)聯(lián)的Connection會(huì)自動(dòng)關(guān)閉,我也測(cè)試過(guò),測(cè)試代碼如下:
string strConn = ConfigurationSettings.AppSettings["SqlDatabase"]; SqlConnection cn=new SqlConnection(strConn); cn.Open(); string sql="select * form student"; SqlCommand cm=new SqlCommand(sql,cn); SqlDataReader dr=cm.ExecuteReader(CommandBehavior.CloseConnection); SqlDataReader dr = mydate.RunProcGetReader(sql); if(dr.Read()) { .......讀取數(shù)據(jù) } dr.Close();//關(guān)閉DataReader Response.Write(cn.State);//輸出Connetion的狀態(tài)
結(jié)果運(yùn)行這一段,輸出:Closed ,可見(jiàn)Connetion確實(shí)自動(dòng)關(guān)閉了!但是如我在上面所說(shuō),我的Coonection是在函數(shù)在建立的,在函數(shù)中執(zhí)行操作然后返回 DataReader,然后在外面讀出數(shù)據(jù),讀取完畢后在外部關(guān)閉DataReader,這樣函數(shù)中的Connetion會(huì)自動(dòng)關(guān)閉嗎?
自己做了個(gè)測(cè)試:(我們學(xué)習(xí)網(wǎng)-www.wearelearn.net)
public SqlConnection conn; protected void Page_Load(object sender, EventArgs e) { conn = new SqlConnection(DAL.SQLHelper.conn_String); show(); } //簡(jiǎn)單的封裝方法 protected static SqlDataReader reDatareader(SqlConnection conn) { SqlCommand cmd = new SqlCommand("select top 10 * from article ", conn ); conn.Open(); SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); return dr; } //應(yīng)用封裝方法 protected SqlDataReader redr() { SqlDataReader dr = reDatareader(conn); return dr; } //調(diào)用類,模擬3層構(gòu)架。 protected void show() { SqlDataReader dr = redr(); if (dr.HasRows) { while (dr.Read()) { } Response.Write(conn.State.ToString()); dr.Dispose(); Response.Write(conn.State.ToString()); } }
結(jié)果輸出 OpenClosed,呵呵,結(jié)果能關(guān)閉。
廣告: