欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

DataReader不能使用using的詳細(xì)示例

 更新時(shí)間:2019年12月03日 09:16:25   作者:森大科技  
這篇文章主要介紹了DataReader不能使用using的詳細(xì)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

本文介紹了DataReader不能使用using的詳細(xì)示例,分享給大家,具有如下:

public static MySqlDataReader ExecuteMySqlReader(string sqlStr)
{
MySqlConnection conn = new MySqlConnection(MyConString);
MySqlCommand cmd = new MySqlCommand(sqlStr, conn);
try
{
conn.Open();
//執(zhí)行CloseConnection命令時(shí),如果關(guān)閉關(guān)聯(lián)的DataReader對(duì)象,則關(guān)聯(lián)的Connection對(duì)象也將關(guān)閉
//用using(conn)會(huì)報(bào)錯(cuò),因?yàn)閳?zhí)行完命令就會(huì)關(guān)閉連接,其它代碼調(diào)用DataReader對(duì)象時(shí),連接已經(jīng)關(guān)閉。
MySqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return dr;
}
catch (Exception exp)
{
throw new Exception(exp.Message);
}
}

PS:MySqlDataReader在Using中使用

結(jié)論:當(dāng)DataReader放在Using方法中時(shí),會(huì)自動(dòng)釋放資源,如果中途出現(xiàn)了異常處理,也同樣會(huì)釋放掉占用的資源。
測(cè)試過程:這里由于沒有將全部分過程記錄下來,只是對(duì)結(jié)果大體的說明一下,有興趣的童鞋可以自己測(cè)試。

首先正常的處理流程:

MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters)
while (dr.Read())
{
keyWords.Add(dr["KeyWord"].ToString());
}
dr.Close()

這樣處理貌似是沒問題,不過在測(cè)試中,如果“keyWords.Add(dr["KeyWord"].ToString());”出現(xiàn)了異常,此時(shí),程序會(huì)調(diào)到異常處理的模塊,這樣,就造成了下邊的close方法不會(huì)被執(zhí)行到,從而造成了數(shù)據(jù)庫(kù)連接數(shù)的不斷累加,當(dāng)達(dá)到最大值時(shí),問題就顯露出來了。

下邊第一種處理方式采用異常處理:

MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters);
try{
while (dr.Read())
{
keyWords.Add(dr["KeyWord"].ToString());
}
}
catch(){
}
finnally{
dr.Close();
}

毫無(wú)疑問,這個(gè)方法很容易想到。

第二種處理方式,這里打算使用using方法進(jìn)行處理。但是根據(jù)理論知識(shí),認(rèn)為這個(gè)是可以的。但是真實(shí)的程序運(yùn)行環(huán)境,確實(shí)有時(shí)不能以理論知識(shí)來指導(dǎo)。現(xiàn)在程序在這,有一個(gè)很合適的測(cè)試環(huán)境,為什么不自己測(cè)試下呢?于是就出現(xiàn)了一下的過程:
我是用的是MySql數(shù)據(jù)庫(kù),C#編寫的程序。

首先補(bǔ)充一些基礎(chǔ)知識(shí):

1、Using定義范圍:即時(shí)釋放資源,在范圍結(jié)束時(shí)釋放資源。當(dāng)在某個(gè)代碼段中使用了類得實(shí)例,而希望無(wú)論什么原因,只要離開了這個(gè)代碼段就自動(dòng)調(diào)用這個(gè)類實(shí)例的Dispose方法釋放資源。

到達(dá)using語(yǔ)句末尾或者中途引發(fā)了異常并且控制離開了語(yǔ)句塊,即觸發(fā)實(shí)例的Dispose方法釋放資源。

然后查看MySqlDataReader的實(shí)現(xiàn):

public sealed class MySqlDataReader : DbDataReader, IDataReader, IDisposable, IDataRecord{...}

確實(shí)繼承了IDisposable方法,理論上應(yīng)該是正確的。

2、MySql查看連接數(shù):

命令: show processlist; 如果是root帳號(hào),你能看到所有用戶的當(dāng)前連接。如果是其它普通帳號(hào),只能看到自己占用的連接。
show processlist;只列出前100條,如果想全列出請(qǐng)使用show full processlist;

有了這兩點(diǎn)理論知識(shí),下邊的測(cè)試就容易多了:

1、不使用using也不關(guān)閉連接:

 MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters);
 while (dr.Read())
 {
 keyWords.Add(dr["KeyWord"].ToString());
 }

測(cè)試,連接數(shù)不斷增多。

2、不使用,采用關(guān)閉操作:

MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters);
while (dr.Read())
{
keyWords.Add(dr["KeyWord"].ToString());
}
dr.Close()

測(cè)試,連接數(shù)不變化。

3、不使用Using,采用關(guān)閉操作,中間執(zhí)行過程制作一個(gè)異常:

MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters);
while (dr.Read())
{
keyWords.Add(dr["Keyord"].ToString());
}
dr.Close()

測(cè)試,連接數(shù)不斷增多。

4、采用Using,無(wú)異常的情況:

Using(MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters))
{
while (dr.Read())
{
keyWords.Add(dr["KeyWord"].ToString());
}
}

測(cè)試,連接數(shù)未增加。

5、采用Using中間制作一個(gè)異常:

Using(MySqlDataReader dr = MySqlHelper.ExecuteReader(MySqlHelper.Conn, CommandType.Text, sqlStr, parameters))
{
while (dr.Read())
{
keyWords.Add(dr["Keyord"].ToString());
}
}

測(cè)試,連接數(shù)未增加。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論