中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

using無法在DataReader中使用如何解決

發布時間:2021-04-08 15:55:45 來源:億速云 閱讀:178 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關using無法在DataReader中使用如何解決,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

具有如下:

public static MySqlDataReader ExecuteMySqlReader(string sqlStr)
{
MySqlConnection conn = new MySqlConnection(MyConString);
MySqlCommand cmd = new MySqlCommand(sqlStr, conn);
try
{
conn.Open();
//執行CloseConnection命令時,如果關閉關聯的DataReader對象,則關聯的Connection對象也將關閉
//用using(conn)會報錯,因為執行完命令就會關閉連接,其它代碼調用DataReader對象時,連接已經關閉。
MySqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return dr;
}
catch (Exception exp)
{
throw new Exception(exp.Message);
}
}

PS:MySqlDataReader在Using中使用

結論:當DataReader放在Using方法中時,會自動釋放資源,如果中途出現了異常處理,也同樣會釋放掉占用的資源。
測試過程:這里由于沒有將全部分過程記錄下來,只是對結果大體的說明一下,有興趣的童鞋可以自己測試。

首先正常的處理流程:

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

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

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

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

毫無疑問,這個方法很容易想到。

第二種處理方式,這里打算使用using方法進行處理。但是根據理論知識,認為這個是可以的。但是真實的程序運行環境,確實有時不能以理論知識來指導。現在程序在這,有一個很合適的測試環境,為什么不自己測試下呢?于是就出現了一下的過程:
我是用的是MySql數據庫,C#編寫的程序。

首先補充一些基礎知識:

1、Using定義范圍:即時釋放資源,在范圍結束時釋放資源。當在某個代碼段中使用了類得實例,而希望無論什么原因,只要離開了這個代碼段就自動調用這個類實例的Dispose方法釋放資源。

到達using語句末尾或者中途引發了異常并且控制離開了語句塊,即觸發實例的Dispose方法釋放資源。

然后查看MySqlDataReader的實現:

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

確實繼承了IDisposable方法,理論上應該是正確的。

2、MySql查看連接數:

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

有了這兩點理論知識,下邊的測試就容易多了:

1、不使用using也不關閉連接:

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

測試,連接數不斷增多。

2、不使用,采用關閉操作:

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

測試,連接數不變化。

3、不使用Using,采用關閉操作,中間執行過程制作一個異常:

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

測試,連接數不斷增多。

4、采用Using,無異常的情況:

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

測試,連接數未增加。

5、采用Using中間制作一個異常:

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

關于using無法在DataReader中使用如何解決就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

射洪县| 望都县| 雅江县| 玉溪市| 澎湖县| 武山县| 陆丰市| 兴化市| 北京市| 诏安县| 肃北| 上高县| 永嘉县| 墨脱县| 土默特左旗| 宁晋县| 武平县| 广汉市| 布尔津县| 宿迁市| 无为县| 浦县| 邛崃市| 石柱| 苗栗市| 拉萨市| 宁强县| 林芝县| 屏山县| 三明市| 洪洞县| 荔波县| 闽侯县| 青河县| 罗田县| 内乡县| 普陀区| 思南县| 龙泉市| 晴隆县| 固阳县|