System.InvalidOperationException: 已有打开的与此命令相关联的 DataReader
来源:互联网 发布:linux系统可以玩lol吗 编辑:程序博客网 时间:2024/06/06 01:39
今天遇到一个Bug: System.InvalidOperationException: 已有打开的与此命令相关联的 DataReader,必须首先将它关闭。
刚开始一直找不到错误,单步调试后,细细分析原因,才发现队员同志错误的调用了一个动态链接库的一个方法。
这个动态链接库的名字叫:DBClass。具体方法如下:
public class DBClass
{
public DBClass();
public DBClass(bool isUseTransaction);
public void Close();
public void DisableCommit();
public void EnableCommit();
public SqlDataReader RunProcedure(string storedProcName, IDataParameter[] parameters);
public int RunProcedure(string storedProcName, IDataParameter[] parameters, out int rowsAffected);
public DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName);
public void RunProcedure(string storedProcName, IDataParameter[] parameters, DataSet dataSet, string tableName);
public static void SynData();
}
{
public DBClass();
public DBClass(bool isUseTransaction);
public void Close();
public void DisableCommit();
public void EnableCommit();
public SqlDataReader RunProcedure(string storedProcName, IDataParameter[] parameters);
public int RunProcedure(string storedProcName, IDataParameter[] parameters, out int rowsAffected);
public DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName);
public void RunProcedure(string storedProcName, IDataParameter[] parameters, DataSet dataSet, string tableName);
public static void SynData();
}
在类库中调用RunProcedure()方法实现执行数据库中定义好的存储过程。由于该同志由于调用的时候不小心少写了一个参数,错误的调用了具有返回值是 SqlDataReader 的重载方法。
protected void QSXX_Insert(struct_qs qs)
{
DBClass db = new DBClass(true);
try
{
SqlParameter[] paras = {
new SqlParameter ("@p_ssq",SqlDbType.VarChar ),
new SqlParameter ("@p_ssl",SqlDbType.VarChar ),
。。。略
};
paras[0].Value = qs.ssq;
paras[1].Value = qs.ssl;
。。。略
db.RunProcedure("QSXX_Insert", paras);
}
finally
{
db.Close();
}
}
{
DBClass db = new DBClass(true);
try
{
SqlParameter[] paras = {
new SqlParameter ("@p_ssq",SqlDbType.VarChar ),
new SqlParameter ("@p_ssl",SqlDbType.VarChar ),
。。。略
};
paras[0].Value = qs.ssq;
paras[1].Value = qs.ssl;
。。。略
db.RunProcedure("QSXX_Insert", paras);
}
finally
{
db.Close();
}
}
程序跑到finally块的时候就出现Bug了。原因是 db.RunProcedure("QSXX_Insert", paras)还回了一个SQLDataReader对象,在没有关闭它之前,想先 执行db.Close()关闭数据库连接是不行的。必须先关闭SQLDataReader对象后才行。解决办法:
解决办法一:增加一个临时变量,点有正确的无SQLDataReader对象还回的方法。
例如:
int effort;
db.RunProcedure("QSXX_Insert", paras, out effort);
db.RunProcedure("QSXX_Insert", paras, out effort);
解决办法二:
SQLDataReader dr = db.RunProcedure("QSXX_Insert", paras);
dr.Close();
关于SqlDataReader的更多信息,以及它与DataSet的区别,网上也有很多解释。
DataSet和SqlDataReader性能比较:
可以参考:http://www.yc-edu.org/netpeixun/2491.html
SqlDataReader与SqlDataAdapter+DataSet 的区别 :
可以参考:http://blog.163.com/china__xuhua/blog/static/199723169201111572524523/
0 0
- System.InvalidOperationException: 已有打开的与此命令相关联的 DataReader
- 如何解决“已有打开的与此命令相关联的 DataReader,必须首先将它关闭。”
- 已有打开的与此命令相关联的 DataReader,必须首先将它关闭
- 如何解决“已有打开的与此命令相关联的 DataReader,必须首先将它关闭。”
- 已有打开的与此命令相关联的 DataReader,必须首先将它关闭
- "已有打开的与此命令相关联的DataReader,必须首先将它关闭"问题解决
- 如何解决“已有打开的与此命令相关联的 DataReader,必须首先将它关闭。”
- 解决方案之"已有打开的与此命令相关联的 DataReader,必须首先将它关闭"
- “已有打开的与此命令相关联的 DataReader,必须首先将它关闭 ”错误解决方法
- 已有打开的与此命令相关联的 DataReader,必须首先将它关闭。
- 已有打开的与此命令相关联的 DataReader,必须首先将它关闭
- "已有打开的与此命令相关联的DataReader,必须首先将它关闭"问题解决
- “已有打开的与此命令相关联的 DataReader,必须首先将它关闭。"问题.
- 错误:“已有打开的与此命令相关联的 DataReader,必须首先将它关闭”的解决方法。
- 网站出现"已有打开的与此命令相关联的 DataReader,必须首先将它关闭。"的解决方案
- 已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭。
- 已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭。
- c#已有打开的与此COMMAND相关联的DataReader
- 初始化三大框架集成的项目时出现的StringUtils问题
- Java UDP Socket
- Oracle Trim函数
- Android 自定义加载Dialog 运行效果流畅
- UIResponder
- System.InvalidOperationException: 已有打开的与此命令相关联的 DataReader
- error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- ubuntu下python处理mysql中文乱码问题
- selenium自动化测试中unittest断言的使用
- 【特征检测】SURF算法源码收集
- Android OTA需要的Cache大小
- SQL2005数据库收缩日志文件
- 第二部分 jQuery选择器
- 浅谈Redis数据库的键值设计