【问题标题】:Proper disposal of SqlConnection inside of using在 using 中正确处理 SqlConnection
【发布时间】:2016-09-21 20:14:55
【问题描述】:

SqlConnection 是否得到妥善处理?

/// <summary>
/// Executes the stored procedure using the parameters.
/// </summary>
/// <param name="storedProcedureName"></param>
/// <param name="parameters"></param>
/// <param name="timeoutValue"></param>
/// <returns></returns>
public DataSet ExecuteStoredProcedure(string storedProcedureName, List<SqlParameter> parameters, int timeoutValue = 0)
{
    var ds = new DataSet();
    var sqlConnection = (SqlConnection)Database.Connection;

    using (var command = new SqlCommand(storedProcedureName, sqlConnection))
    {
        //setting CommandTimeout specified value
        if (timeoutValue > 0)
        {
            command.CommandTimeout = timeoutValue;
        }

        command.CommandType = CommandType.StoredProcedure;

        foreach (var param in parameters)
        {
            command.Parameters.Add(param);
        }

        _databaseHelper.OpenConnection(command);
        var adapter = new SqlDataAdapter(command);
        adapter.Fill(ds);

        _databaseHelper.CloseConnection(command);
    }

    return ds;
}

【问题讨论】:

  • 这完全取决于_databaseHelper.CloseConnection() 的作用。 Database.Connection 的使用也是值得怀疑的——通常你不希望 Dispose() 使用在其他地方拥有的东西。如果Database.Connection 确实每次都返回一个新的连接实例,我会将其切换为GetConnection() 方法。
  • @dahlbyk 为什么要依赖closeconnection?如果在此行之前有异常怎么办?
  • var sqlConnection = (SqlConnection)Database.Connection;如果此代码返回新连接,我认为问题不会是
  • @dahlbyk Database.Connection 是 DbContext.Connection

标签: c# sql .net visual-studio


【解决方案1】:

你不会在这里打开一个新的连接,所以无论如何它都不会被处理掉,这不是交易。

SqlCommand 在任何情况下都会正确关闭,因为您使用的是using 构造。但是,如果这一行,例如var adapter = new SqlDataAdapter(command);会抛出异常,_databaseHelper.CloseConnection(command);显然不会被调用

【讨论】:

    【解决方案2】:

    sqlConnection 是否得到正确处理?

    没有。 _databaseHelper.CloseConnection(command) 暗示它可能包含一个command.Connection.Close() 调用,这相当于调用Dispose(),但这不会被描述为“正确”,因为它不在finally 块中。

    【讨论】:

      猜你喜欢
      • 2017-10-31
      • 2018-10-17
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      • 1970-01-01
      • 2021-08-20
      • 2021-09-09
      • 1970-01-01
      相关资源
      最近更新 更多