code first提示已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭解决方法
使用codefirst查询当然是必不可少的,但有时不小心可能很简单的查询也会导致异常。
下面用codefirst做个示例简单演示下异常发生的场景:
var attendlist = db.Database.SqlQuery<AttendCountViewModel>("select STUDENTID,SUM(isnull(REALHOUR,0)) As REALHOUR from ATTEND_LIST where ATTENDDATE='" + geDate + "' and GOTIME is not null and GETOFFTIME is not null group by STUDENTID");
foreach (AttendCountViewModel item in attendlist)
{
STUDENT_INFO student = db.STUDENT_INFO.Find(item.STUDENTID);
db.SaveChanges();
}
逻辑比较简单,就是首先查询一个AttendCountViewModel列表,并当作IEnumerable<AttendCountViewModel>对象进行读取的时候,在里面再进行查询操作,不出意外的话,程序会毫不留情的报错:
已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭。
用Reflector查看OjbectQuery对象的GetEnumerator方法,不难找出异常的原因:由于Entity在读取数据的时候使用的是 DbDataReader进行读取,当作为IEnumuerable<T>对象MoveNext进行操作时,只是使用 DbDataReader进行一次Read操作,因此当查询的结果未完全读取完的时候,数据库连接一直被占用,当再次进行查询操作时便回出现上面的异常。
至于解决方案,网上很容易就能找到:
- 一种方案就是在数据库连接串中设置MultipleActiveResultSets=True,但需要注意的是该方案只适合Sql Server 2005以及以上版本,所以什么Sql Server 2000之类设置也没用。
- 还一种方案就比较直接,别用什么AsEnumerable之类(直接将查询结果丢进foreach),尽量使用ToArray、ToList方法,什么说 Entity用ToList方法会有效率问题啥的,别乱说先,Reflector很好用的,看看源代码先,别随便整个测试啥的就说Entity这样慢那样 不行。
- 转自http://www.kwstu.com/ArticleView/guandebao_2013917144342904
使用codefirst查询当然是必不可少的,但有时不小心可能很简单的查询也会导致异常。
下面用codefirst做个示例简单演示下异常发生的场景:
|
1
2
3
4
5
6
7
|
var attendlist = db.Database.SqlQuery<AttendCountViewModel>("select STUDENTID,SUM(isnull(REALHOUR,0)) As REALHOUR from ATTEND_LIST where ATTENDDATE='" + geDate + "' and GOTIME is not null and GETOFFTIME is not null group by STUDENTID"); foreach (AttendCountViewModel item in attendlist) { STUDENT_INFO student = db.STUDENT_INFO.Find(item.STUDENTID); db.SaveChanges(); } |
逻辑比较简单,就是首先查询一个AttendCountViewModel列表,并当作IEnumerable<AttendCountViewModel>对象进行读取的时候,在里面再进行查询操作,不出意外的话,程序会毫不留情的报错:
已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭。
用Reflector查看OjbectQuery对象的GetEnumerator方法,不难找出异常的原因:由于Entity在读取数据的时候使用的是 DbDataReader进行读取,当作为IEnumuerable<T>对象MoveNext进行操作时,只是使用 DbDataReader进行一次Read操作,因此当查询的结果未完全读取完的时候,数据库连接一直被占用,当再次进行查询操作时便回出现上面的异常。
至于解决方案,网上很容易就能找到:
- 一种方案就是在数据库连接串中设置MultipleActiveResultSets=True,但需要注意的是该方案只适合Sql Server 2005以及以上版本,所以什么Sql Server 2000之类设置也没用。
- 还一种方案就比较直接,别用什么AsEnumerable之类(直接将查询结果丢进foreach),尽量使用ToArray、ToList方法,什么说 Entity用ToList方法会有效率问题啥的,别乱说先,Reflector很好用的,看看源代码先,别随便整个测试啥的就说Entity这样慢那样 不行。
code first提示已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭解决方法的更多相关文章
- 已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭
已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭 引用: http://www.cnblogs.com/maxao/archive/2011/03/18/19881 ...
- C#:(问题)已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭
解决方法如下:1.不同的reader对象不要共用一个Connection对象.2.不要在while代码段内执行reader.Close();语句.否则继续执行while代码段内语句会报“阅读器关闭时尝 ...
- EF 已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭
在以下代码中,当第二次foreach时会抛出该异常,原因是:由于Entity在读取数据的时候使用的是DbDataReader进行读取,当作为IEnumuerable<T>对象MoveNex ...
- linq查询时查询语句中附带多个查询时“已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭”
主要原因是因为EF采用的 DataReader来进行数据的存储,此时connection使用的是同一个. 例如: list = _tzNewsService.GetAll().Where(w => ...
- 【转】已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭
在运用Linq to sql 或者 linq to entity等相关linq技术进行数据库访问操作时,如果发生上述异常是因为是因为.NET內部是使用DataReader作数据存取,DataReade ...
- [EF] - "已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭" 之解决
错误 解决 在 ConnectionString 中添加 MultipleActiveResultSets=true(适用于SQL 2005以后的版本).MultipleActiveResultSet ...
- C#异常之(已有打开的与此 Command 相关联,已有打开的与此命令相关联的 DataReader,必须首先将它关闭。)
异常提示:“System.InvalidOperationException”类型的异常在 System.Data.dll 中发生,但未在用户代码中进行处理 其他信息: 已有打开的与此 Comman ...
- 报错:已有打开的与此命令相关联的 DataReader,必须首先将它关闭。
SqlParameter[] sp = { new SqlParameter("@nGridID",SqlDbType.BigInt), new SqlParameter(&quo ...
- 出错提示:“Could not flush the DNS Resolver Cache: 执行期间,函数出了问题”的解决方法
在DNS解析中,出错提示:"Could not flush the DNS Resolver Cache: 执行期间,函数出了问题"的解决方法 . 由于公司网站空间更换了服务商. ...
随机推荐
- bash基础
bash 是一个为GNU计划编写的Unix shell.它的名字是一系列缩写:Bourne-Again SHell - 这是关于Bourne shell(sh)的一个双关语(Bourne again ...
- Unity Animator动画状态机 深入理解(三)二维混合树
介绍二维之前,先说说一维吧~ 这个是通过旋转角度速度快慢来表现身体的大转和中转~ 通过一个-133~133的数值来进行控制. 注:后面的那个对钩是镜像的意思. 其实二维混合树并没有想象中的那么难.先来 ...
- Unity Animator动画状态机 深入理解(一)
接触Unity以来就已经有了Animator,Animation用的少,不过也大概理解他俩之间的一个区别于联系. 图中其实就是Animator和Animation之间的区别于联系了,啊!你肯定会告诉我 ...
- 【转载】STL之priority_queue
参考资料:传送门先回顾队列的定义:队列(queue)维护了一组对象,进入队列的对象被放置在尾部,下一个被取出的元素则取自队列的首部.priority_queue特别之处在于,允许用户为队列中存储的元素 ...
- 如何把家里的pc改装成linux服务器
家里有一台pc笔记本闲置在家,最近想搭建一个ubuntu系统玩一下kvm. 这个方法能避免家里宽带每隔一段时间ip自动变换. 我用到了: 1.亚马逊的aws(ec2) 2.家里的路由器 3.aws里装 ...
- jquery理财贷款计算器
先放效果图,如下: 需要引入jquery ,bootstrap jq代码如下: function pCalculator(amount,term,rating,repayway){ var zhong ...
- Make 命令教程
http://www.ruanyifeng.com/blog/2015/02/make.html 作者: 阮一峰 日期: 2015年2月20日 代码变成可执行文件,叫做编译(compile):先编译这 ...
- [译]C#编码约定
原文:https://msdn.microsoft.com/en-us/library/ff926074.aspx 编码约定的目的是: 创建统一格式的代码,让读者的注意力更集中在内容上面,而不是结构 ...
- spring MVC mybatis dispacherServlet(源码解读)
以下源码版本(4.2.0.RELEASE) dispacherServlet是servlet的实现类,是spring MVC的前端转发器,是spring MVC的核心. 那么它做了哪些事呢? 它主要做 ...
- 【转】MySQL性能优化的最佳21条经验
文章转自: http://blog.csdn.net/waferleo/article/details/7179009 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关 ...