小弟看了一下PetShop的源码,有些地方没有弄懂请教一下各位大侠。里面有一个对数据库操作的类SqlHelper中有一个ExecuteReader方法查询数据库返回,最后释放连接是怎么写的,我怎么没有找到,我直接用这个方法来查询数据,打开的连接最后都没有释放呀!!       各位大侠请“指教”

解决方案 »

  1.   


    CommandBehavior.CloseConnection
    在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭。
      

  2.   

    /// <summary>
    ///使用给定的连接字符串 执行SQL命令并返回结果集
    /// </summary>
    /// <res>
    /// 例如:  
    ///  SqlDataReader r = ExecuteReader(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
    /// </res>
    /// <param name="connectionString">连接字符串</param>
    /// <param name="commandType">SQL命令类型(字符串或者存储过程)</param>
    /// <param name="commandText">SQL命令字符串或者存储过程名字</param>
    /// <param name="commandParameters">SQL命令的参数,可单个或者数组</param>
    /// <returns>SqlDataReader</returns>
    public static SqlDataReader ExecuteReader(string p_cnString, CommandType p_cmdType, string p_cmdText, params SqlParameter[] p_cmdParms) 
    {
        SqlCommand cmd = new SqlCommand();
        SqlConnection cn = new SqlConnection(p_cnString);
        //在此处使用try/catch是因为如果抛出异常我们希望关闭连接,而当没有datareader时,commandBehaviour.CloseConnection不会自动关闭连接
        try 
        {
          PrepareCommand(cmd, cn, null, p_cmdType, p_cmdText, p_cmdParms);
          SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
    //CommandBehavior.CloseConnection,关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭
          cmd.Parameters.Clear();
          return dr;
        }
        catch 
        {
          cn.Close();
          throw;
        }
    }
      

  3.   

    多谢ralpha08(被水淹死的鱼)。 可是它里面的有些方法是这样的,这个里面没有您说的那个,请教一下这个是怎么释放的。        public static int ExecuteNonQuery(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {            SqlCommand cmd = new SqlCommand();            PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
                int val = cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
                return val;
            }
      

  4.   

    可是它里面的有些方法是这样的,这个里面没有您说的那个,请教一下这个是怎么释放的。
    ================================
    你说的这个注释如下
    /// <summary>
    /// 使用现有的数据库连接 执行SQL命令(不返回结果集)
    /// 说明:一般在连续执行多个Command命令时使用该函数(即使用同一个数据库连接提高性能)
    /// </summary>也就是说 这个函数是需要手动释放的,适用于连续执行多个Command命令
    比如可以这样
    using (SqlConnection cn = new SqlConnection(p_cnString)) 
    {
        ExecuteNonQuery(......) ;//第一个
        ExecuteNonQuery(......) ;//第2个
        ExecuteNonQuery(......) ;//第3个
    }
    区别于以下,以下适用于一个SQL命令
    ---------------------------------------
    /// <summary>
    ///使用给定的连接字符串 执行SQL命令(不返回结果集)
    ///说明:一般在执行单个Command命令时使用,如果连续执行多个Command命令不使用该函数
    /// </summary>
    public static int ExecuteNonQuery(string p_cnString, CommandType p_cmdType, string p_cmdText, params SqlParameter[] p_cmdParms) 
    { SqlCommand cmd = new SqlCommand(); using (SqlConnection cn = new SqlConnection(p_cnString)) 
    {
    PrepareCommand(cmd, cn, null, p_cmdType, p_cmdText, p_cmdParms);
    int val = cmd.ExecuteNonQuery();
    cmd.Parameters.Clear();
    return val;
    }
    }
      

  5.   

    因为它用了using 连家出了using作用域之后就会释放
    using (SqlConnection cn = new SqlConnection(p_cnString))