解決方法如下:
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 關鍵字,它作為語句,可以將它所定義范圍內的對象都釋放掉。
我將代碼粘貼如下,僅供參考:
private 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

9
public static DataTable returnDataTable(string mySql, SqlParameter[] parameters)10
{11
myConn = new SqlConnection(strConn);12
using (myCmd = new SqlCommand(mySql, myConn))13
{14
try15
{16
myCmd.Parameters.AddRange(parameters);17
myAdapter = new SqlDataAdapter(myCmd);18
myTable.Clear();19
myAdapter.Fill(myTable);20
}21
catch22
{23
connClose();24
}25
finally26
{27
connClose();28
}29
}30
return myTable;31
}
文章列表
請先 登入 以發表留言。