SQLDataReader и CommandBehaviour.CloseConnection - PullRequest
       28

SQLDataReader и CommandBehaviour.CloseConnection

4 голосов
/ 11 августа 2011

У меня есть универсальный класс под названием "db", который напрямую обращается к базе данных.И есть метод с именем «ExecuteDataReader», как показано ниже:

public SqlDataReader ExecuteDataReader(SqlCommand cmd)
        {
            try
            {
                OpenConnection();
                cmd.Connection = conn;
                cmd.CommandType = CommandType.StoredProcedure;              

                SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

                return dr;
            }
            catch (Exception ex)
            {
                Utils.Debug(string.Format("Err in {0}.{1} : {2}\nSQL : {3}", this.GetType(), "ExecuteDataReader", ex.Message, cmd.CommandText));
                return null;
            }            
        }

Затем я выполняю ресурсоемкий запрос, который перебирает 10000 родительских записей и 20000 дочерних записей для обновления в базе данных.И тогда я получил следующую ошибку:

Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.

Чтобы решить эти проблемы, я должен явно вызвать dr.Close () после выполнения.

static void ProcessAssessmentCriteria(string UnitReference)
        {
            SqlCommand cmd = new SqlCommand("TRACKING.DBTool_GetUniqueAssessmentCriteriaByUnitReference");
            cmd.Parameters.Add("@UnitReference", SqlDbType.VarChar, 20).Value = UnitReference;

            SqlDataReader dr = db.ExecuteDataReader(cmd);

            if (dr.HasRows)
            {
                while (dr.Read())
                {                    
                    ProcessDetailAssessmentCriteria(UnitReference, dr["AssessmentRefNumber"].ToString());
                    Console.WriteLine("---------------");
                }
            }

            dr.Close();
        }

Насколько мне известно, CommandBehaviour.CloseConnection () автоматически закрывает соединение.Но похоже, что это не закрывается сейчас.Не могли бы вы просветить меня?Благодаря.

1 Ответ

3 голосов
/ 11 августа 2011

CommandBehavior.CloseConnection от MSDN

Когда команда выполнена, связанный объект Connection закрыто когда связанный объект DataReader закрыт .

То есть, только когда вы закрываете DataReader, соединение закрывается.

...