如DBHelper类:
 public static SqlDataReader ExtExecuteReader(string sql, params SqlParameter[] pams)
        {
            using(SqlConnection conn=DBHelper.Con)
            {
                SqlCommand cmd = new SqlCommand(sql, conn);
                if (pams!=null && pams.Length>0)
                {
                    foreach (SqlParameter par in pams)
                    {
                        cmd.Parameters.Add(par);
                    }
                }
                return cmd.ExecuteReader();
            }
        }数据交互类: public static IList<Modal.Grade> GetTreeData()
        {
            IList<Modal.Grade> list = null;
            string sql = "select * from ext_grade";
            //如果这样调用就会出现reader读取器尝试关闭出现异常
            //原因是SqlConnection被释放后读取器讲同时失去数据
            //SqlDataReader reader =DBHelper. ExtExecuteReader(sql,null);
            SqlCommand cmd = new SqlCommand(sql, DBHelper.Con);
            SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);            while(reader.Read())
            {
                list = new List<Modal.Grade>();
                Modal.Grade grade = new Modal.Grade();
                grade.FCount = Convert.ToInt32(reader["FCount"].ToString());
                grade.FParID = Convert.ToInt32(reader["FParID"].ToString());
                grade.FName = reader["FName"].ToString();
                grade.Fid = new Guid(reader["FID"].ToString());
                grade.Id = reader["FID"].ToString();
                list.Add(grade);
            }
            reader.Close();//同时可以释放sqlconneciton
            return list;
        }由于本人多次犯同样的错误 希望大家引以为戒

解决方案 »

  1.   

    哈哈,没人像你这么写的,为什么在DBHelper中要关掉SqlConection呢?
    DBHelper这样写不行吗?
      SqlCommand cmd = new SqlCommand();
      SqlConnection conn = new SqlConnection(connectionString);   try {
            PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
            SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            cmd.Parameters.Clear();
            return rdr;
          }
       catch {
              conn.Close();
              throw;
             }