鏂扮枂cba璧涚▼ :DataReader不能使用using的詳細示例

cba广东队赛程 www.axwwg.com  更新時間:2020-01-25 00:02:18   作者:佚名   我要評論(0)

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


public static MySqlDataReader ExecuteMySqlReader(string sqlStr)
{
MySqlConnection c

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

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());
}
}

測試,連接數未增加。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

  • C#使用SQL DataReader訪問數據的優點和實例
  • DATASET 與 DATAREADER對象有什么區別
  • c#中SqlHelper封裝SqlDataReader的方法
  • 詳細說明asp.net中datareader 和 dataset 的區別
  • DataReader、DataSet、DataAdapter和DataView使用介紹
  • asp.net中用DataReader高效率分頁
  • asp.net SqlDataReader綁定Repeater

相關文章

  • DataReader不能使用using的詳細示例

    DataReader不能使用using的詳細示例

    本文介紹了DataReader不能使用using的詳細示例,分享給大家,具有如下: public static MySqlDataReader ExecuteMySqlReader(string sqlStr) { MySqlConnection c
    2020-01-25
  • asp.net MVC 在Controller控制器中實現驗證碼輸出功能

    asp.net MVC 在Controller控制器中實現驗證碼輸出功能

    asp.net mvc項目使用到驗證碼,為了讓以前的WebForm代碼能利用上代碼經過稍微的改動即可使用代碼如下: using System; using System.Collections.Generic; usin
    2020-01-25
  • 淺談.Net Core 認證系統源碼解析

    淺談.Net Core 認證系統源碼解析

    不知不覺.Net Core已經推出到3.1了,大多數以.Net為技術棧的公司也開始逐步的切換到了Core,從業也快3年多了,一直堅持著.不管環境怎么變,堅持自己的當初的選擇,堅持信
    2020-01-25
  • .NET連接池的問題詳解

    .NET連接池的問題詳解

    NET 連接池救生員 防止可淹沒應用程序的池溢出 William Vaughn 大多數 ADO.NET 數據提供程序使用連接池,以提高圍繞 Microsoft 斷開連接的 .NET 結構構建的應用程序
    2020-01-25
  • .Net獲取IP地址的方法

    .Net獲取IP地址的方法

    獲取本機IP 2.獲取網頁客戶端IP /// <summary> /// 獲取IPv4地址 /// </summary> /// <returns> </returns> public static string G
    2020-01-25
  • ASP.NET Core 3框架揭秘之 異步線程無法使用IServiceProvider問題

    ASP.NET Core 3框架揭秘之 異步線程無法使用IServiceProvider問題

    標題反映的是上周五一個同事咨詢我的問題,我覺得這是一個很好的問題。這個問題有助于我們深入理解依賴注入框架在ASP.NET Core中的應用,以及服務實例的生命周期。
    2020-01-25
  • .net Core 使用IHttpClientFactory請求實現

    .net Core 使用IHttpClientFactory請求實現

    導讀:本文已添加在 晨曦微服務之旅 ,現在自己在嘗試微服務架構,一邊學邊做項目快速的進入狀態。當然在學習的過程中會將自己學到的知識進行分享。 一、為什么
    2020-01-25
  • .Net Core3.0 WEB API中使用FluentValidation驗證(批量注入)

    .Net Core3.0 WEB API中使用FluentValidation驗證(批量注入)

    為什么要使用FluentValidation 1.在日常的開發中,需要驗證參數的合理性,不緊前端需要驗證傳毒的參數,后端也需要驗證參數 2.在領域模型中也應該驗證,做好防御
    2020-01-25
  • C# 進制轉換的實現(二進制、十六進制、十進制互轉)

    C# 進制轉換的實現(二進制、十六進制、十進制互轉)

    由于二進制數在C#中無法直接表示,所以所有二進制數都用一個字符串來表示 例如: 二進制: 1010 表示為 字符串:"1010" int d = 10; //十進制轉二進制字符串
    2020-01-25
  • .NET Core3.1發布(翻譯)

    .NET Core3.1發布(翻譯)

    .NET Core3.1發布 我們很高興宣布.NET Core 3.1的發布。實際上,這只是對我們兩個多月前發布的.NET Core 3.0的一小部分修復和完善。最重要的是.NET Core 3.1是長
    2020-01-25

最新評論