原文: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