使用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,必须首先将它关闭解决方法的更多相关文章

  1. 已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭

    已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭 引用:   http://www.cnblogs.com/maxao/archive/2011/03/18/19881 ...

  2. C#:(问题)已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭

    解决方法如下:1.不同的reader对象不要共用一个Connection对象.2.不要在while代码段内执行reader.Close();语句.否则继续执行while代码段内语句会报“阅读器关闭时尝 ...

  3. EF 已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭

    在以下代码中,当第二次foreach时会抛出该异常,原因是:由于Entity在读取数据的时候使用的是DbDataReader进行读取,当作为IEnumuerable<T>对象MoveNex ...

  4. linq查询时查询语句中附带多个查询时“已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭”

    主要原因是因为EF采用的 DataReader来进行数据的存储,此时connection使用的是同一个. 例如: list = _tzNewsService.GetAll().Where(w => ...

  5. 【转】已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭

    在运用Linq to sql 或者 linq to entity等相关linq技术进行数据库访问操作时,如果发生上述异常是因为是因为.NET內部是使用DataReader作数据存取,DataReade ...

  6. [EF] - "已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭" 之解决

    错误 解决 在 ConnectionString 中添加 MultipleActiveResultSets=true(适用于SQL 2005以后的版本).MultipleActiveResultSet ...

  7. C#异常之(已有打开的与此 Command 相关联,已有打开的与此命令相关联的 DataReader,必须首先将它关闭。)

    异常提示:“System.InvalidOperationException”类型的异常在 System.Data.dll 中发生,但未在用户代码中进行处理  其他信息: 已有打开的与此 Comman ...

  8. 报错:已有打开的与此命令相关联的 DataReader,必须首先将它关闭。

    SqlParameter[] sp = { new SqlParameter("@nGridID",SqlDbType.BigInt), new SqlParameter(&quo ...

  9. 出错提示:“Could not flush the DNS Resolver Cache: 执行期间,函数出了问题”的解决方法

    在DNS解析中,出错提示:"Could not flush the DNS Resolver Cache: 执行期间,函数出了问题"的解决方法  . 由于公司网站空间更换了服务商. ...

随机推荐

  1. vue-router

    官方文档: 旧版:https://github.com/vuejs/vue-router/tree/1.0/docs/zh-cn 新版:http://router.vuejs.org/(2.0版本) ...

  2. xv6的作业翻译——作业1 - shell和系统调用

    Xv6的lecture LEC 1 Operating systems   L1: O/S overview L1:O/S概述   * 6.828 goals 6.828的目标   Understan ...

  3. 用rose画UML图(用例图,活动图)

    用rose画UML图(用例图,活动图) 首先,安装rose2003,电脑从win8升到win10以后,发现win10并不支持rose2003的安装,换了rose2007以后,发现也不可以. 解决途径: ...

  4. Chrome 开发工具之Sources

    Sources面板主要用于查看web站点的资源列表及javascript代码的debug 熟悉面板 了解完面板之后,下面来试试这些功能都是如何使用的. 文件列表 展示当前页面内所引用资源的列表,和平常 ...

  5. 【JavaWeb】Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基础框架(五)

    SpringSecurity(2) 好久没有写了,之前只写了一半,我是一边开发一边写Blog一边上班,所以真心没有那么多时间来维护Blog,项目已经开发到编写逻辑及页面部分了,框架基本上已经搭建好不会 ...

  6. mybatis:choose when otherwise标签

    choose标签是按顺序判断其内部when标签中的test条件是否成立,如果有一个成立,则 choose 结束. 当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的 ...

  7. Django基础,Day8 - 管理后台定制显示

    自定义admin表单 展示效果一: from django.contrib import admin from polls.models import Question class QuestionA ...

  8. 推荐几款我一直在用的chrome插件(下)

    请先看:推荐几款我一直在用的chrome插件(上) 6. Pocket 可以很方便的保存文章.视频等供以后查看,即实现了“Read it later”功能.有了 Pocket,您可以将所有想下次读的内 ...

  9. Greenplum-概念篇

    Greenplum主要组件包括:Master.Segments.Interconnect:其他组件包括ETL Server.Greenplum command center等.0. 组件之-Maste ...

  10. PHP 位运算(&, |, ^, ~, <<, >>)及 PHP错误级别报告设置(error_reporting) 详解

    位运算符允许对整型数中指定的位进行求值和操作. 位运算符 例子 名称 结果 $a & $b And(按位与) 将把 $a 和 $b 中都为 1 的位设为 1. $a | $b Or(按位或) ...