天天看點

編寫SqlHelper使用,在将ExecuteReader方法封裝進而讀取資料庫中的資料時會産生Additional information: 閱讀器關閉時嘗試調用 Read 無效問題,解決方法與解釋

在自學楊中科老師的視訊教學時,拓展編寫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);

                }

            }

       }

運作出錯抛異常如下圖:

編寫SqlHelper使用,在将ExecuteReader方法封裝進而讀取資料庫中的資料時會産生Additional information: 閱讀器關閉時嘗試調用 Read 無效問題,解決方法與解釋

也就是:      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();

忙了一下午解決這個問題,正準備寫一篇,結果上網看到了相似的問題及解決方法,寫的比我還好的多得多!!!!有點心痛哎,原來早有前輩寫好了,沒辦法隻有将原創改為轉載了!!!呵呵呵...

不過沒事,多寫一遍就多想一遍記憶就更深一些了,别人也就更快一些的找到此問題的解決方法并掌握它,畢竟多了我這一篇!!那位前輩的相似問題解決方法位址:點選打開連結 如果看我的還了解不了的可以看看這位前輩寫的,比我好得多了,哈哈哈...

更多知識分享:微笑空間站

)的相關問題位址  寫的比我好的多了,大家看我這篇寫了解的還不夠透徹的話,建議看這位前輩的!!!!!!!!!!!!!!

繼續閱讀