zoukankan      html  css  js  c++  java
  • [System.InvalidOperationException] = {"阅读器关闭时尝试调用 MetaData 无效。"}

           本错误的环境是.Net4.0,数据库访问使用LinQ。本例在数据库访问的类里面将DBAccessDataContext (数据库上下文)做为类变量,后面的数据库操作函数都使用这个类变量,在多线程的环境下面就爆出了[System.InvalidOperationException] = {"阅读器关闭时尝试调用 MetaData 无效。"} 的错误。

    具体的代码见下方

    作为类变量的DBAccessDataContext
    1 public class test1 { 
    2     DBAccessDataContext db = new DBAccessDataContext()
    3 
    4     public string GetName(int id) 
    5     {
    6     return (from user in db.DBUser select user.name).FirstOrDefault();
    7     }
    8 }

    解释如下:

    DBAccessDataContext依赖的Connection不能再用来执行其他Command命令。所以你的代码段会报“已有打开的与此命令相关联的 DataReader,必须首先将它关闭。” 错误提示。
    解决方法如下:
    方法1、使用多线程控制的方法。用信号量来控制同一个时间只能有一个线程来访问这个函数。
     1 public class test1 { 
     2     //将类变量降级为局部变量
     3     //DBAccessDataContext db = new DBAccessDataContext()
     4     public string GetName(int id) 
     5     {
     6        using (DBAccessDataContext db = new DBAccessDataContext())//降级后的变量
     7             {
     8         return (from user in db.DBUser select user.name).FirstOrDefault();
     9         }
    10     }
    11 }
    方法2、使用将类变量降级为局部变量,这个就不存在多线程中的资源冲突(具体代码见下方)。
    1 public class test1 { 
    2     //使用lock进行访问控制,保证同一时间只能有一个线程访问。
    3     DBAccessDataContext db = new DBAccessDataContext()
    4     public string GetName(int id) 
    5     {
    6        lock(db){
    7         return (from user in db.DBUser select user.name).FirstOrDefault();}
    8     }
    9 }

    2013-01-0112:16:44


    作者:kissazi2
    出处:http://www.cnblogs.com/kissazi2/
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    测试管理_测试工作量估算
    Mycat原理、应用场景
    linux负载均衡总结性说明(四层负载/七层负载)
    Spring自动装配Bean的五种方式
    计算机组成原理总结
    MyBatis总结
    系统吞吐量(TPS)、用户并发量、性能测试概念和公式
    初探Nginx服务器的整体架构
    mybatis架构理解
    linux环境上运行.net core 初探
  • 原文地址:https://www.cnblogs.com/kissazi2/p/2841421.html
Copyright © 2011-2022 走看看