zoukankan      html  css  js  c++  java
  • 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这样慢那样 不行。
  • 相关阅读:
    一个功能完善的资源管理器
    数据结构和算法
    Build Native Mobile Apps in HTML5: PhoneGap from Start to Finish
    HTML5安全:CORS(跨域资源共享)简介
    Start A mobile web app
    ASP.NET MVC4 常见问题集
    ASP.NET MVC4 ASP.NET Web API OAuth2 delegation with Windows Azure Access Control Service
    【转】HTTP access control (CORS)
    ASP.NET MVC4最新特性介绍 (待续)
    C#实现小写金额转换大写的方法
  • 原文地址:https://www.cnblogs.com/LoveQin/p/5643185.html
Copyright © 2011-2022 走看看