多線程下,屢次操做數據庫報錯,There is already an open DataReader associated with this Command which must be closed

原文:https://www.cnblogs.com/sdusrz/p/4433108.htmlhtml

執行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應用程序中。ui

      ADO.NET 2.的一個新特徵多數據結果集(Multiple Active Result Sets,簡稱MARS)-它容許在單個鏈接上執行多重的數據庫查詢或存儲過程。這樣的結果是,你可以在單個鏈接上獲得和管理多個、僅向前引用的、只讀的結果集。目前實現這個功能的數據庫只有Sql Server 2005。因此當咱們針對Sql Sever 2005的時候,須要從新審視DataReader對象的使用。使用SqlServer 2005,能夠在一個Command對象上同時打開多個DataReader,節約數據庫聯接所耗費的服務器資源,在實際開發中廣泛存在的一種典型的從數據庫中讀寫數據的情形是,你可使用多重鏈接而如今只用一個鏈接就足夠了。例如,若是你有一些來自於幾個表中的數據-它們不能被聯結到一個查詢中,那麼你就會有多重的鏈接-每一個鏈接都有一個與之相關連的命令用於讀取數據。一樣,若是你正在向一個表寫數據,那麼你須要另一個鏈接或鏈接集合-若是有多個表要被更新的話。this

例以下面的代碼spa

               

複製代碼
       //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;code

MultipleActiveResultSets的做用是指定多活動的結果集是否與指定的連接相互關聯;類型是bool類型;true表明與指定的連接關聯;false表明與指定的連接不關聯;默認是false;server

相關文章
相關標籤/搜索