執行SqlDataReader.Read之后,如果還想用另一個SqlCommand執行Insert或者Update操作的話,會得到一個錯誤提示:There is already an open DataReader associated with this Command which must be closed first.,然后一般就會產生數據保存失敗的異常。
解決方法是在ConnectionString中加上一個參數“MultipleActiveResultSets”, 將其值設置為true。
SqlConnection conn = new SqlConnection("server=s01;database=MOULTONWEB;uid=sa;pwd=cn1234567890;MultipleActiveResultSets=True
MultipleActiveResultSets屬性詳解
ADO.NET 1.x 利用SqlDataReader讀取數據,針對每個結果集需要一個獨立的連接。當然,你還必須管理這些連接並且要付出相應的內存和潛在的應用程序中的高度擁擠的瓶頸代價-特別是在數據集中的Web應用程序中。
ADO.NET 2.的一個新特征多數據結果集(Multiple Active Result Sets,簡稱MARS)-它允許在單個連接上執行多重的數據庫查詢或存儲過程。這樣的結果是,你能夠在單個連接上得到和管理多個、僅向前引用的、只讀的結果集。目前實現這個功能的數據庫只有Sql Server 2005。所以當我們針對Sql Sever 2005的時候,需要重新審視DataReader對象的使用。使用SqlServer 2005,可以在一個Command對象上同時打開多個DataReader,節約數據庫聯接所耗費的服務器資源,在實際開發中普遍存在的一種典型的從數據庫中讀寫數據的情形是,你可以使用多重連接而現在只用一個連接就足夠了。例如,如果你有一些來自於幾個表中的數據-它們不能被聯結到一個查詢中,那么你就會有多重的連接-每個連接都有一個與之相關連的命令用於讀取數據。同樣,如果你正在向一個表寫數據,那么你需要另外一個連接或連接集合-如果有多個表要被更新的話。
例如下面的代碼
//MultipleActiveResultSets=true打開聯接 string connstr = "server=(local);database=northwind;integrated security=true;MultipleActiveResultSets=true"; SqlConnection conn = new SqlConnection(connstr); conn.Open(); SqlCommand cmd1 = new SqlCommand("select * from customers", conn); SqlCommand cmd2 = new SqlCommand("select * from orders", conn); SqlDataReader rdr1 = cmd1.ExecuteReader(); // next statement causes an error prior to SQL Server 2005 SqlDataReader rdr2 = cmd2.ExecuteReader(); // now you can reader from rdr1 and rdr2 at the same time. conn.Close();
近期的一個項目是關於不同數據庫同步的操作,考慮到數據的及時性,應用程序的性能,在數據庫鏈接字符串中加入MultipleActiveResultSets;
MultipleActiveResultSets的作用是指定多活動的結果集是否與指定的鏈接相互關聯;類型是bool類型;true代表與指定的鏈接關聯;false代表與指定的鏈接不關聯;默認是false;