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();
    }
       在类库中调用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();
             }
         }
          程序跑到finally块的时候就出现Bug了。原因是  db.RunProcedure("QSXX_Insert", paras)还回了一个SQLDataReader对象,在没有关闭它之前,想先 执行db.Close()关闭数据库连接是不行的。必须先关闭SQLDataReader对象后才行。解决办法:
             解决办法一:增加一个临时变量,点有正确的无SQLDataReader对象还回的方法。
                   例如:     
                                     int effort;
                 
                                    db.RunProcedure("QSXX_Insert", paras, out effort);
             解决办法二: 
                                     SQLDataReader dr =     db.RunProcedure("QSXX_Insert", paras);
                                     dr.Close();

                
    关于SqlDataReader的更多信息,以及它与DataSet的区别,网上也有很多解释。
      

     DataSetSqlDataReader性能比较:

                        可以参考:http://www.yc-edu.org/netpeixun/2491.html

    SqlDataReader与SqlDataAdapter+DataSet 的区别 :
                  可以参考:http://blog.163.com/china__xuhua/blog/static/199723169201111572524523/
           
0 0