当前位置:编程学习 > C#/ASP.NET >>

这样操作ExecuteReader 对吗

以下是写的两个关于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();
                }
            }
        } --------------------编程问答-------------------- 发错地方了,建议转到C#区 --------------------编程问答-------------------- 友情提醒,如果不会转的话,请联系管理员或者,把这个帖子结了,然后再去C#区发一个
--------------------编程问答-------------------- 谢谢楼主,已经转过来了 --------------------编程问答-------------------- 谢谢楼上,已经转过来了 --------------------编程问答-------------------- 发现以下几个问题。第一个解决了。
1、SqlDataReader reader = new SqlDataReader();改成SqlDataReader reader; 
2、并非所有代码路径都返回值
3、reader.Close();reader.Dispose();使用了未赋值的局部变量 --------------------编程问答-------------------- 使用using的话,到最后会默认调用Dispose(),而using会自动调用Close()释放资源,所以无需在using中写conn.Close()。reader.Dispose()好像也不需要,GC会自动处理的。 --------------------编程问答-------------------- “而using会自动调用Close()释放资源” 改为“而Dispose()会自动调用Close()释放资源” --------------------编程问答-------------------- 上面代码如何调整能正常运行。 --------------------编程问答-------------------- 错误代码,因为用了using,即已经释放了资源 --------------------编程问答-------------------- 代码改成以下,但是还是有问题,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();
                }
            }

        } --------------------编程问答-------------------- using 相当于dispose(); --------------------编程问答-------------------- finally
                {
                    reader.Dispose();
                }
为撒要dispose呢?你这样就不管什么情况都不dispose了。你这个方法什么都返回不了。finally是无条件执行的。 --------------------编程问答-------------------- SqlCommand cmd = new SqlCommand("", cnn);这个你的存储过程名字都没有设置。执行了有什么意义呢?
要用reader 别用存储过程。用select 语句。 --------------------编程问答--------------------   cmd.CommandType = CommandType.StoredProcedure;
  cmd.CommandText = SPName;

这是存储过程 --------------------编程问答-------------------- finally
                {
                    reader.Dispose();
                }
这句不要的。你在外面不用返回结果吗? --------------------编程问答-------------------- 我个人觉得不应该返回IDataReader....因为DataReader是联机操作,势必涉及到使用完之后的清理工作,常见的问题就是用完了reader却没有把connection关闭,导致内存泄漏,我觉得用Lamda表达式把操作包裹起来比较好
try
{
using(IDataReader reader=new ...)
{
   action(reader);
   if(!reader.IsClosed)
   {
      reader.Close();
   }
}
}
catch
{
  throw;
}
finally
{
   ...//释放数据库对象
} --------------------编程问答-------------------- 并非所有代码路径都返回值
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);
                }
            }

        } --------------------编程问答-------------------- 请不要直接返回SqlDataReader,如果一定要返回它,你必须在函数参数里传入SqlConnection对象,保证数据库连接是外部传入,并在SqlDataReader使用完毕后才关闭的,如果是你函数内部创建SqlConnection对象,那么你无法确定该对象何时关闭,如果函数返回时就关闭了,那么SqlDataReader将不可用,同理,SqlDataReader对象也不能关闭,否则你返回的是一个已经释放的SqlDataReader对象,如何操作?
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,