C#:(问题)已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭
解决方法如下:
1、不同的reader对象不要共用一个Connection对象。
2、不要在while代码段内执行reader.Close();语句。否则继续执行while代码段内语句会报“阅读器关闭时尝试调用 Read 无效。”错误提示。 摘自:http://www.cnblogs.com/aerkate/archive/2011/12/20/2294753.html
(一)
昨天在调试的过程中总是跳出如题所示的Exception,对数据库的操作也是赶鸭子上架,所以一直也没有什么完整的认识,但应该是在一个连接里面不同的操作所造成的冲突。
大清早跑过来google了一下,确实不少人遇到这个问题。在csdn上面的一个帖子里面找到了个解决方法
”数据库 一般是 一个 Connection 只允许 有一个 活动的(打开的) SqlDataReader要想 一个 Connection 允许 有多个 活动的(打开的) SqlDataReader 就需要设置 Connection 的 MultipleActiveResultSets=True“
原帖子地址:http://topic.csdn.net/u/20090420/15/c1cc7d3e-31b9-4670-a21d-caf61398e9d3.html
在app.config里面加了 MultipleActiveResultSets=True 然后果然问题解决了,有些认识但还是没有能清楚,先记录一下。
(二)
这个异常相信许多的朋友都遇到过,我也经常遇到, 都是编码时大意,没有关闭连接,简单处理就OK之~~
但今天同样的问题,把我郁闷坏了,整个网站操作数据库的地方都报这个错误,出现的频率很高,刷新一下就好了,使得网站不能正常运行。
我仔细检查了几遍,都没发现什么问题,但还是报错,最后没办法,把所有DataReader读取的地方全删之,改成用DataTable存放数据,在费周折,还是不行。
这个问题困扰了我一天,不过最后还是得以解决,解决方案简单归纳如下:
1、主要原因是 DataReader 在打开使用时,一个 SqlConnection 只允许打开一个 DataReader,在开启另一个 DataReader 时,必须将前面一个先 Close 掉。
2、或许有朋友会问,我在语句中并未使用 DataReader,未何也提示同样的错误,这个DataReader隐藏在哪里,我给大家在这里指出来,由于本人研究的还不够深入,只知道有一种方法的调用后会生成 DataReader,我想这也是绝大多数人遇到头疼的问题。
在使用数据库更新或插入语句时,大家通常使用 SqlCommand 的 ExecuteNonQuery() 方法,并且前提是定义了一个公共的数据库连接(如果每次查询时都生成新连接的话不会存在这个问题,但那样数据库占用的资源相对会高很多),在ExecuteNonQuery() 后,内部会生成一个空的 DataReader 对象,并当当前的数据库连接关闭掉后,该 DataReader 才会释放。因此在大家使用更新方法时,推荐使用 using 关键字,它作为语句,可以将它所定义范围内的对象都释放掉。
我将代码粘贴如下,仅供参考:
private static string strConn = ConfigurationManager.ConnectionStrings["SQLLSB2008"].ConnectionString;2
private static SqlConnection myConn = null;3

4
private static SqlDataAdapter myAdapter = new SqlDataAdapter();5
private static SqlCommand myCmd = new SqlCommand();6
private static DataTable myTable = new DataTable();7

8

9
public static DataTable returnDataTable(string mySql, SqlParameter[] parameters)10
{11
myConn = new SqlConnection(strConn);12
using (myCmd = new SqlCommand(mySql, myConn))13
{14
try15
{16
myCmd.Parameters.AddRange(parameters);17
myAdapter = new SqlDataAdapter(myCmd);18
myTable.Clear();19
myAdapter.Fill(myTable);20
}21
catch22
{23
connClose();24
}25
finally26
{27
connClose();28
}29
}30
return myTable;31
}C#:(问题)已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭的更多相关文章
- code first提示已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭解决方法
使用codefirst查询当然是必不可少的,但有时不小心可能很简单的查询也会导致异常. 下面用codefirst做个示例简单演示下异常发生的场景: var attendlist = db.Databa ...
- 已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭
已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭 引用: http://www.cnblogs.com/maxao/archive/2011/03/18/19881 ...
- 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 ...
- 报错:已有打开的与此命令相关联的 DataReader,必须首先将它关闭。
SqlParameter[] sp = { new SqlParameter("@nGridID",SqlDbType.BigInt), new SqlParameter(&quo ...
- C#异常之(已有打开的与此 Command 相关联,已有打开的与此命令相关联的 DataReader,必须首先将它关闭。)
异常提示:“System.InvalidOperationException”类型的异常在 System.Data.dll 中发生,但未在用户代码中进行处理 其他信息: 已有打开的与此 Comman ...
- Vmware问题: 开机提示“虚拟机已被打开,是否获得所有权?”& Vmware检测不到USB
"一只美丽的小鸟,在绿色的草坪上蹦来跳去,很是可爱"----清风徐来 问题1: Vmware开机提示"虚拟机已被打开,是否获得所有权?" 解决: 关闭虚拟机,用 ...
随机推荐
- CentOS依赖包查找工具(https://centos.pkgs.org)
https://centos.pkgs.org 通过这个地址,可以搜索出一些常用包放在哪些依赖或者仓库上.
- obd2 J1962M to DB9
- Install Linux Kernel 4.10 In CentOS and Ubuntu
https://www.ostechnix.com/install-linux-kernel-4-10-centos-ubuntu/
- 【mysql】mysql统计查询count的效率优化问题
mysql统计查询count的效率优化问题 涉及到一个问题 就是 mysql的二级索引的问题,聚簇索引和非聚簇索引 引申地址:https://www.cnblogs.com/sxdcgaq8080/p ...
- linux集成开发环境
Linux操作系统的种种集成开发环境 随着Linux的逐渐兴起,已经有为数众多的程序在上面驰骋了,许多开发环境(Development Environment)也应运而生.好的开发环境一定是集成了编辑 ...
- Jacob调用COM组件总结,实例
转自:http://blog.csdn.net/whw6_faye/article/details/5418506 最近做了一个Java Jacob调用COM组件的东西,其中遇到了不少问题,现在把经验 ...
- SWT常用组件
SWT类所代表的事件常量: 事件类型常量 说明 SWT.Activate 当激活窗口时 SWT.Arm 菜单项被选中之前 SWT.Close 关闭窗口时 SWT.Collapse 折叠树的节点时 SW ...
- OpenShift 如何获取bearer Token以便进行各种API调用
Openshift 需要通过bearer token的方式和API进行调用,比如基于Postman就可以了解到,输入bearer token后 1.如何获取Bearer Token 但Bearer T ...
- iOS:视图切换的第二种方式:UINavigationController导航栏控制器
UINavigationController:一个以栈的形式管理多视图的容器,负责子控制器之间的跳转.由于以栈的方式管理视图,各个视图的切换就是压栈和出栈操作,所以出栈后的视图会立即销毁. 介绍: & ...
- 【Android UI】使用RelativeLayout与TableLayout实现登录界面
使用RelativeLayout与TableLayout分别实现两种登录界面,学习RelativeLayout布局 中如何对齐与调整组件相对位置,使用TableLayout实现登录界面,学习如何设置列 ...