【问题标题】:SQLDataReader and CommandBehaviour.CloseConnectionSQLDataReader 和 CommandBehaviour.CloseConnection
【发布时间】:2011-08-11 09:46:01
【问题描述】:

我有一个名为“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() 会自动关闭连接。但是现在好像没有关闭。你能启发我吗?谢谢。

【问题讨论】:

    标签: c# sqldatareader sqlconnection


    【解决方案1】:

    来自MSDN的CommandBehavior.CloseConnection

    命令执行时,关联的Connection对象为 当关联的 DataReader 对象关闭时

    所以只有当你关闭 DataReader 时,连接才会关闭。

    【讨论】:

    • 哦,是的。我误解了。 :)
    猜你喜欢
    • 2013-02-06
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    相关资源
    最近更新 更多