博客園,一種說是和外鍵有關,此處引用的是用戶,添加了Using方法
http://www.uipower.com/bbs/thread-36788-1-1.html
(
reader 是基於連接的, 查詢結果一次一條的讀取, )
|
一下,我本人感覺較好點的解釋,只是是能接受的
http://www.cnblogs.com/liaojunbo/archive/2008/04/26/1172348.html
這個異常相信許多的朋友都遇到過,我也經常遇到, 都是編碼時大意,沒有關閉連接,簡單處理就OK之~~
但今天同樣的問題,把我鬱悶壞了,整個網站操作數據庫的地方都報這個錯誤,出現的頻率很高,刷新一下就好了,使得網站不能正常運行。
我仔細檢查了幾遍,都沒發現什麼問題,但還是報錯,最後沒辦法,把所有DataReader讀取的地方全刪之,改成用DataTable存放數據,在費周折,還是不行。
這個問題困擾了我一天,不過最後還是得以解決,解決方案簡單歸納如下:
1、主要原因是 DataReader 在打開使用時,一個 SqlConnection 只允許打開一個 DataReader,在開啓另一個 DataReader 時,必須將前面一個先 Close 掉。
2、或許有朋友會問,我在語句中並未使用 DataReader,未何也提示同樣的錯誤,這個DataReader隱藏在哪裏,我給大家在這裏指出來,由於本人研究的還不夠深入,只知道有一種方法的調用後會生成 DataReader,我想這也是絕大多數人遇到頭疼的問題。
在使用數據庫更新或插入語句時,大家通常使用 SqlCommand 的 ExecuteNonQuery() 方法,並且前提是定義了一個公共的數據庫連接(如果每次查詢時都生成新連接的話不會存在這個問題,但那樣數據庫佔用的資源相對會高很多),在ExecuteNonQuery() 後,內部會生成一個空的 DataReader 對象,並當當前的數據庫連接關閉掉後,該 DataReader 纔會釋放。因此在大家使用更新方法時,推薦使用 using 關鍵字,它作爲語句,可以將它所定義範圍內的對象都釋放掉。
我將代碼粘貼如下,僅供參考:
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 }