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/
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    敏捷开发中的故事点到底是什么?如何预估故事点?
    Worktile 进军软件开发与协作的初心与野心
    宽带无法登陆GitHub解决——修改host
    IDEA自定义类注释和方法注释(自定义groovyScript方法实现多行参数注释)
    SpringBoot2.x整合redis和使用redis缓存
    简单聊聊JVM
    IDEA打包web项目为war,通过本地Tomcat启动war
    多表更新
    unittest suite集合实现原理
    14.0 native webview H5切换
  • 原文地址:https://www.cnblogs.com/kissazi2/p/2841421.html
Copyright © 2011-2022 走看看