文章出處

解決方法如下:
1、不同的reader對象不要共用一個Connection對象。
2、不要在while代碼段內執行reader.Close();語句。否則繼續執行while代碼段內語句會報“閱讀器關閉時嘗試調用 Read 無效。”錯誤提示。

摘自:http://www.cnblogs.com/aerkate/archive/2011/12/20/2294753.html

 (一)

 昨天在調試的過程中總是跳出如題所示的Exception,對數據庫的操作也是趕鴨子上架,所以一直也沒有什么完整的認識,但應該是在一個連接里面不同的操作所造成的沖突。

 大清早跑過來google了一下,確實不少人遇到這個問題。在csdn上面的一個帖子里面找到了個解決方法

 ”數據庫 一般是 一個 Connection 只允許 有一個 活動的(打開的) SqlDataReader要想 一個 Connection 允許 有多個 活動的(打開的) SqlDataReader 就需要設置 Connection 的 MultipleActiveResultSets=True“

原帖子地址:http://topic.csdn.net/u/20090420/15/c1cc7d3e-31b9-4670-a21d-caf61398e9d3.html

在app.config里面加了 MultipleActiveResultSets=True 然后果然問題解決了,有些認識但還是沒有能清楚,先記錄一下。

 

 (二)

   這個異常相信許多的朋友都遇到過,我也經常遇到, 都是編碼時大意,沒有關閉連接,簡單處理就OK之~~
      但今天同樣的問題,把我郁悶壞了,整個網站操作數據庫的地方都報這個錯誤,出現的頻率很高,刷新一下就好了,使得網站不能正常運行。
      我仔細檢查了幾遍,都沒發現什么問題,但還是報錯,最后沒辦法,把所有DataReader讀取的地方全刪之,改成用DataTable存放數據,在費周折,還是不行。    
      這個問題困擾了我一天,不過最后還是得以解決,解決方案簡單歸納如下:

1、主要原因是 DataReader 在打開使用時,一個 SqlConnection 只允許打開一個 DataReader,在開啟另一個 DataReader 時,必須將前面一個先 Close 掉。 

2、或許有朋友會問,我在語句中并未使用 DataReader,未何也提示同樣的錯誤,這個DataReader隱藏在哪里,我給大家在這里指出來,由于本人研究的還不夠深入,只知道有一種方法的調用后會生成 DataReader,我想這也是絕大多數人遇到頭疼的問題。

     在使用數據庫更新或插入語句時,大家通常使用 SqlCommand 的 ExecuteNonQuery() 方法,并且前提是定義了一個公共的數據庫連接(如果每次查詢時都生成新連接的話不會存在這個問題,但那樣數據庫占用的資源相對會高很多),在ExecuteNonQuery() 后,內部會生成一個空的 DataReader 對象,并當當前的數據庫連接關閉掉后,該 DataReader 才會釋放。因此在大家使用更新方法時,推薦使用 using 關鍵字,它作為語句,可以將它所定義范圍內的對象都釋放掉。

    我將代碼粘貼如下,僅供參考:

 1private static string strConn = ConfigurationManager.ConnectionStrings["SQLLSB2008"].ConnectionString;
 2    private static SqlConnection myConn = null;
 3
 4    private static SqlDataAdapter myAdapter = new SqlDataAdapter();
 5    private static SqlCommand myCmd = new SqlCommand();
 6    private static DataTable myTable = new DataTable();
 7
 8
 9public static DataTable returnDataTable(string mySql, SqlParameter[] parameters)
10    {
11        myConn = new SqlConnection(strConn);
12        using (myCmd = new SqlCommand(mySql, myConn))
13        {
14            try
15            {
16                myCmd.Parameters.AddRange(parameters);
17                myAdapter = new SqlDataAdapter(myCmd);
18                myTable.Clear();
19                myAdapter.Fill(myTable);
20            }

21            catch
22            {
23                connClose();
24            }

25            finally
26            {
27                connClose();
28            }

29        }

30        return myTable;
31    }

 

 

 

 


文章列表


不含病毒。www.avast.com
創作者介紹
創作者 IT工程師數位筆記本 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣( 2658 )