以下是写的两个关于ExecuteReader执行,不知道这样操作有没有问题,请大家指导
/// <summary>
        /// SqlDataReader非参数
        /// </summary>
        /// <param name="SPName"></param>
        /// <returns></returns>
        public static SqlDataReader ExecuteReader(string SPName)
        {          
            using (SqlConnection cnn = new SqlConnection(ConnectionString))
            {
                SqlCommand cmd = new SqlCommand("", cnn);
                SqlDataReader reader = new SqlDataReader();
                try
                {
                    cnn.Open();
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandText = SPName;
                    reader = cmd.ExecuteReader();
                    return reader;
                }
                catch (Exception ex)
                {
                    System.Console.WriteLine(ex.Message);
                }
                finally
                {
                    reader.Close();
                    reader.Dispose();
                    cnn.Close();
                }
            }        }        /// <summary>
        /// SqlDataReader参数
        /// </summary>
        /// <param name="alListItem"></param>
        /// <param name="SPName"></param>
        /// <returns></returns>
        public static SqlDataReader ExecuteReader(ArrayList alListItem, string SPName)
        {                         
            using (SqlConnection cnn = new SqlConnection(ConnectionString))
            {
                SqlCommand cmd = new SqlCommand("", cnn);
                SqlDataReader reader = new SqlDataReader();
                try
                {
                    SqlDataAdapter adapter = new SqlDataAdapter();
                    cnn.Open();
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandText = SPName;
                    SqlParameter[] SqlParameter = DBParameters.GetParameters(alListItem, SPName);
                    foreach (SqlParameter pt in SqlParameter)
                    {
                        cmd.Parameters.Add(pt);
                    }
                    reader = cmd.ExecuteReader();
                    return reader;
                }
                catch (Exception ex)
                {
                    System.Console.WriteLine(ex.Message);
                }
                finally
                {
                    reader.Close();
                    reader.Dispose();
                    cnn.Close();
                }
            }
        }

解决方案 »

  1.   

    发现以下几个问题。第一个解决了。
    1、SqlDataReader reader = new SqlDataReader();改成SqlDataReader reader; 
    2、并非所有代码路径都返回值
    3、reader.Close();reader.Dispose();使用了未赋值的局部变量
      

  2.   

    使用using的话,到最后会默认调用Dispose(),而using会自动调用Close()释放资源,所以无需在using中写conn.Close()。reader.Dispose()好像也不需要,GC会自动处理的。
      

  3.   

    “而using会自动调用Close()释放资源” 改为“而Dispose()会自动调用Close()释放资源”
      

  4.   

    错误代码,因为用了using,即已经释放了资源
      

  5.   

    代码改成以下,但是还是有问题,usering 不能用于sqlsatareader,所以用的reader.Dispose();,
    1、并非所有代码路径都返回值
    2、reader.Dispose();使用了未赋值的局部变量
    /// <summary>
            /// SqlDataReader非参数
            /// </summary>
            /// <param name="SPName"></param>
            /// <returns></returns>
            public static SqlDataReader ExecuteReader(string SPName)
            {          
                using (SqlConnection cnn = new SqlConnection(ConnectionString))
                {
                    SqlCommand cmd = new SqlCommand("", cnn);
                    SqlDataReader reader ;
                    try
                    {
                        cnn.Open();
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.CommandText = SPName;
                        reader = cmd.ExecuteReader();
                        return reader;
                    }
                    catch (Exception ex)
                    {
                        System.Console.WriteLine(ex.Message);
                    }
                    finally
                    {
                        reader.Dispose();
                    }
                }        }
      

  6.   

    finally
                    {
                        reader.Dispose();
                    }
    为撒要dispose呢?你这样就不管什么情况都不dispose了。你这个方法什么都返回不了。finally是无条件执行的。
      

  7.   

    SqlCommand cmd = new SqlCommand("", cnn);这个你的存储过程名字都没有设置。执行了有什么意义呢?
    要用reader 别用存储过程。用select 语句。
      

  8.   

      cmd.CommandType = CommandType.StoredProcedure;
      cmd.CommandText = SPName;这是存储过程
      

  9.   

    finally
                    {
                        reader.Dispose();
                    }
    这句不要的。你在外面不用返回结果吗?
      

  10.   

    我个人觉得不应该返回IDataReader....因为DataReader是联机操作,势必涉及到使用完之后的清理工作,常见的问题就是用完了reader却没有把connection关闭,导致内存泄漏,我觉得用Lamda表达式把操作包裹起来比较好
    try
    {
    using(IDataReader reader=new ...)
    {
       action(reader);
       if(!reader.IsClosed)
       {
          reader.Close();
       }
    }
    }
    catch
    {
      throw;
    }
    finally
    {
       ...//释放数据库对象
    }
      

  11.   

    并非所有代码路径都返回值
    public static SqlDataReader ExecuteReader(string SPName)
            {
                using (SqlConnection cnn = new SqlConnection(ConnectionString))
                {
                    SqlCommand cmd = new SqlCommand("", cnn);
                    SqlDataReader reader;
                    try
                    {
                        cnn.Open();
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.CommandText = SPName;
                        reader = cmd.ExecuteReader();
                        return reader;                    
                    }
                    catch (Exception ex)
                    {
                        System.Console.WriteLine(ex.Message);
                    }
                }        }
      

  12.   

    请不要直接返回SqlDataReader,如果一定要返回它,你必须在函数参数里传入SqlConnection对象,保证数据库连接是外部传入,并在SqlDataReader使用完毕后才关闭的,如果是你函数内部创建SqlConnection对象,那么你无法确定该对象何时关闭,如果函数返回时就关闭了,那么SqlDataReader将不可用,同理,SqlDataReader对象也不能关闭,否则你返回的是一个已经释放的SqlDataReader对象,如何操作?