在自學楊中科老師的視訊教學時,拓展編寫SqlHelper使用,在将ExecuteReader方法封裝進而讀取資料庫中的資料時
會産生Additional information: 閱讀器關閉時嘗試調用 Read 無效問題,錯誤産生時,我的代碼如下:
SqlHelper.cs代碼如下:
public static SqlDataReader ExecuteReader(string sql)
{
using (SqlConnection conn = new SqlConnection(ConnString))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
return cmd.ExecuteReader();
}
}
}
運作主程式代碼如下:
private void btn2_Click(object sender, RoutedEventArgs e)
{
using (SqlDataReader reader = SqlHelper.ExecuteReader("select * from T_Student"))
{
while (reader.Read())
{
string H = reader["Hobbit"].ToString();
MessageBox.Show("愛好分别為:" + H);
}
}
}
運作出錯抛異常如下圖:
也就是: Additional information: 閱讀器關閉時嘗試調用 Read 無效
解決方法:
将SqlHelper.cs代碼改為:
public static SqlDataReader ExecuteReader(string sql)
{
SqlConnection conn = new SqlConnection(ConnString);
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
return cmd.ExecuteReader();
}
}
與原SqlHelper.cs的差別在于将建立資料庫連接配接對象的using(){ }方法去掉!其他運作程式代碼不變!
這樣運作後将不會再出現異常,能正常從資料庫中讀取資料了!!!
解決方法解釋:
看到這篇文章大家對using(){ }方法有一定的了解,它的作用就是在其“()”中聲明建立對象并在“{ }”中使用後,自動将其占用的系統資源釋放!相當于try-finally的作用,建立資料庫連接配接,使用後,将資料庫再關閉一樣。
是以就有了,在SqlHelper.cs中,如果在資料庫聲明建立時使用using(){ },那麼在主程式運作到“SqlDataReader reader = SqlHelper.ExecuteReader("select * from T_Student")”時,調用SqlHelper.cs中的ExecuteReader()已經結束,系統已經将資料庫所占用的資源已經釋放,由于要使用傳回的SqlDataHelper是以不能關閉連接配接,那樣閱讀器SqlDataHelper已經被釋放,那它相應的Read()方法還能被調用嗎,這肯定不行,是以要将資料庫聲明連接配接時的sing(){ }去掉!
同時應注意正常從資料庫讀取資料時,ExecuteReader讀出的資料是在伺服器端,要想讀取顯示就必須使資料庫是連接配接着的;而DataSet則是用于小量的資料的存儲,它是将資料從伺服器都出來後,直接放到用戶端,伺服器連接配接斷開後,它的資料還是存儲在用戶端的,因而還能被顯示出來!!!
注意:在改正運作後,要将資料庫關閉,因為沒用using(){ }去釋放資料庫連接配接,這時手動關閉資料庫在上述主程式結尾加上reader.Close();
忙了一下午解決這個問題,正準備寫一篇,結果上網看到了相似的問題及解決方法,寫的比我還好的多得多!!!!有點心痛哎,原來早有前輩寫好了,沒辦法隻有将原創改為轉載了!!!呵呵呵...
不過沒事,多寫一遍就多想一遍記憶就更深一些了,别人也就更快一些的找到此問題的解決方法并掌握它,畢竟多了我這一篇!!那位前輩的相似問題解決方法位址:點選打開連結 如果看我的還了解不了的可以看看這位前輩寫的,比我好得多了,哈哈哈...
更多知識分享:微笑空間站
)的相關問題位址 寫的比我好的多了,大家看我這篇寫了解的還不夠透徹的話,建議看這位前輩的!!!!!!!!!!!!!!
轉載于:https://www.cnblogs.com/xuyongsky1234/p/4113570.html