【问题标题】:When running this as a loop, should I put the Open() and Close() outside or inside the loop?当将此作为循环运行时,我应该将 Open() 和 Close() 放在循环外部还是内部?
【发布时间】:2016-06-27 03:57:05
【问题描述】:

我有一段代码

        await this._Conn.OpenAsync();
        using (SqlCommand cmd = new SqlCommand("AddOrUpdateAnswer", this._Conn))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@AnswerVal", Answer.AnswerVal);
            cmd.Parameters.AddWithValue("@QuestionId", Answer.QuestionId);
            cmd.Parameters.AddWithValue("@PartnerId", Answer.PartnerId);
            await cmd.ExecuteNonQueryAsync();
        }
        this._Conn.Close();

目前不在循环内,但现在我想在循环内运行。我的问题是我是否应该这样写

        for ( var Answer in Answers )
        {
            await this._Conn.OpenAsync();
            using (SqlCommand cmd = new SqlCommand("AddOrUpdateAnswer", this._Conn))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@AnswerVal", Answer.AnswerVal);
                cmd.Parameters.AddWithValue("@QuestionId", Answer.QuestionId);
                cmd.Parameters.AddWithValue("@PartnerId", Answer.PartnerId);
                await cmd.ExecuteNonQueryAsync();
            }
            this._Conn.Close();
        }

或者我可以像

那样在整个循环中打开它吗
            await this._Conn.OpenAsync();
            for ( var Answer in Answers )
            {
                using (SqlCommand cmd = new SqlCommand("AddOrUpdateAnswer", this._Conn))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@AnswerVal", Answer.AnswerVal);
                    cmd.Parameters.AddWithValue("@QuestionId", Answer.QuestionId);
                    cmd.Parameters.AddWithValue("@PartnerId", Answer.PartnerId);
                    await cmd.ExecuteNonQueryAsync();
                }
            }
            this._Conn.Close();

为什么或为什么不?

【问题讨论】:

    标签: c# sql asp.net sql-server


    【解决方案1】:

    打开一个新连接会产生一定程度的开销,尽管连接池确实会显着降低这种开销。

    通常最好在循环之前打开一次连接。

    如果抛出异常,您当前的代码将永远不会关闭连接。您应该在打开连接时使用using statement,而不是显式关闭它。让IDisposable 模式为您解决这个问题。

    【讨论】:

    【解决方案2】:

    为每次迭代打开和关闭连接是一种浪费的重复:

    for ( var Answer in Answers )
        {
            await this._Conn.OpenAsync();
            using (SqlCommand cmd = new SqlCommand("AddOrUpdateAnswer", this._Conn))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@AnswerVal", Answer.AnswerVal);
                cmd.Parameters.AddWithValue("@QuestionId", Answer.QuestionId);
                cmd.Parameters.AddWithValue("@PartnerId", Answer.PartnerId);
                await cmd.ExecuteNonQueryAsync();
            }
            this._Conn.Close();
        }
    

    如果您考虑进行的任何数据库查询,请打开连接:

    await this._Conn.OpenAsync();
    // Do what is needed while the connection is open.
    // Then close the connection.
    this._Conn.Close();
    

    尽量不要将此问题与您在连接打开时所做的事情恰好是您在连接打开时单独执行的操作的循环相混淆。

    这就像你在商店里取一篮苹果而不是取一个苹果。无需每次取完一个苹果就离开商店,然后再去买下一个苹果。

    【讨论】:

      猜你喜欢
      • 2021-01-05
      • 2014-03-18
      • 2010-09-13
      • 2018-03-17
      • 2014-03-24
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多