RT,调试的时候没有任何问题,但发布到iis上时,多点十几下连接数就会到达512页面提示错误,查找源头是这个方法,但该释放、该关闭的都释放关闭了,还有什么方法?在配置文件上也写了限制,可还是报错/// <summary>
/// 执行存储过程
/// </summary>
/// <param name="procName">存储过程的名称</param>
/// <param name="prams">存储过程所需参数</param>
/// <param name="dataSet">返回DataReader对象</param>
public void RunProc(string procName, SqlParameter[] prams, out SqlDataReader dataReader) 
{
///创建Command
            SqlCommand cmd = CreateProcCommand(procName, prams);            try
            {
                ///读取数据
                dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            }
            catch (Exception ex)
            {                dataReader = null;
                //dataReader.Close();
                ///记录错误日志
                SystemError.CreateErrorLog(ex.Message);
            }
            finally
            {
                cmd.Dispose();
            }
            
}

解决方案 »

  1.   

    if dt!=null
    {
      dt=null;
    }
      

  2.   

    执行cmd.Dispose有什么意义?你搞错了目标对象。你返回的dataReader变量如何保证及时Dispose?如果你没有什么靠谱的担保,那么最好修改你的设计,让RunProc直接返回数据集合,而不要返回DataReader。
      

  3.   

    问题可能在 CommandBehavior.CloseConnection 里面吧
    没有正常关闭数据库连接。
      

  4.   

    实际上ado.net已经很精简了,你可以在其它地方去包装,而对于执行ExecuteReader这条语句没有必要搞什么包装。///创建Command
      SqlCommand cmd = CreateProcCommand(procName, prams);  ///读取数据
      using(SqlDataReader dataReader = cmd.ExecuteReader())
      {
            while(dataReader.Read())
            {
                  进行你的处理
             }
      }
     [/code]
    你完全没有必要把它封装为什么单独的方法。
      

  5.   

      SqlCommand cmd = CreateProcCommand(procName, prams);
      using(SqlDataReader dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
      {
        while(dataReader.Read())
        {
            调用方法处理一条记录(datareader);
         }
      }或者  SqlCommand cmd = CreateProcCommand(procName, prams);
      using(SqlDataReader dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
      {
         调用方法处理遍历整个结果集和(datareader);
      }
    这包括了你的全部代码代码,写起来也不复杂啊。你何必把它搞什么封装呢?直接在调用你的RunProc的原来的地方直接这样写不就好了嘛。就算你封装什么RunProc方法,别人也没有必要用它啊。
      

  6.   

    是不是有些sqldatareader没有dispose,尤其是在发生异常的情况下
    还有可以在调用结束以后调用conn。close()方法
      

  7.   

    sp1234 说的很对
    使用Using 自动释放链接
    你的是cmd 释放了,但是你的SqlConnect链接没有Open