博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
There is already an open DataReader associated with this Command which must be closed first
阅读量:6234 次
发布时间:2019-06-22

本文共 2878 字,大约阅读时间需要 9 分钟。

  hot3.png

下面代码可能会报如标题所示错误

var contacts = from c in db.Contact                select c;foreach (Contact c in contacts) {    if (c.Phones.IsLoaded == false)        c.Phones.Load();    if (c.Phones.Count > 0) {        foreach (ContactPhone p in c.Phones){        }    }}

Tip: 真正执行查询是在foreach语句执行时才发生,在之前只是建立查询。

解决办法:

1,修改连接串,加上MultipleActiveResultSets=true

2, 一次性先把数据读出来

var contacts = from c in db.Contact                select c;List results = contacts.ToList();foreach (Contact c in results){}

提示:contacts.ToList() 的作用是强制加载contact列表,也就是先强制执行查询,再做后续处理。

原文:

关于

 

 

分类: 2009-05-19 23:18 3225人阅读 (1)

MultipleActiveResultSets可以使数据库连接复用。这样就不怕数据库的连接资源被耗尽了。使用方法很简单,只需要把它加到数据的连接字符串中即可。

例如:server=(local);Integrated Security = true;database=AdventureWorks;MultipleActiveResultSets=true;

测试用例:

[c-sharp]

  1. using System; 
  2. using System.Threading; 
  3. using System.Data.SqlClient; 
  4. using System.Configuration; 
  5. namespace ConsoleApplication1 
  6. public class Example 
  7.     { 
  8. public static void Main() 
  9.         { 
  10.         SqlConnection sql1 = new SqlConnection("server=(local);Integrated Security = true;database=AdventureWorks;"); 
  11.             sql1.Open(); 
  12.             SqlCommand comm1 = new SqlCommand(); 
  13.             comm1.CommandText = "select 1"; 
  14.             comm1.CommandType = System.Data.CommandType.Text; 
  15.         comm1.Connection = sql1; 
  16.             comm1.ExecuteNonQuery(); 
  17.             sql1.Close(); 
  18.             Console.ReadLine(); 
  19.         } 
  20.     } 

编译后,打开bin/debug/ConsoleApplication1.exe。

在SQL Server 2008 Management Studio中打开一个新窗口,输入sp_who

按F5执行,可以发现已经有一个用户连接到AdventureWorks数据库了。

再打开一个ConsoleApplication1.exe,发现又会多一个用户连接到AdventureWorks数据库。

现在把程序的连接字符串改为server=(local);Integrated Security = true;database=AdventureWorks;MultipleActiveResultSets=true;

按上面的顺序执行,发现不管打开多少个ConsoleApplication1.exe,数据库中没有用户或只有一个用户连接着AdventureWorks数据库。

这就是数据库连接复用的好处了。

关于数据库连接字符串的其它用法,参见:

 

 

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();

 

 

转载于:https://my.oschina.net/wzzz/blog/529542

你可能感兴趣的文章
CSS中hover出现二级菜单
查看>>
前端学PHP之正则表达式函数
查看>>
设计模式(一)观察者模式
查看>>
二叉树遍历入门 Lebal:research
查看>>
迁项目、领任务
查看>>
git
查看>>
IoC深入理解
查看>>
远程部署项目,修改catalina.bat文件 完美解决在代理服务器上HttpURLConnection 调接口超时的问题...
查看>>
HTTP===如何理解网关
查看>>
Spark DataFrame的groupBy vs groupByKey
查看>>
毕业诗
查看>>
PHP7语法知识(一):语言基础
查看>>
luoguP2711 小行星
查看>>
学习android学习必备的java基础知识--四大内部类
查看>>
开源爬虫软件汇总
查看>>
#linux shell#模拟日志生成过程
查看>>
Scroll View 使用心得
查看>>
网络爬虫基础知识(Python实现)
查看>>
前端学HTTP之Web主机托管
查看>>
深入理解line-height与vertical-align
查看>>