【问题标题】:Dispose object that has been instantiated as method parameter c#处置已实例化为方法参数的对象c#
【发布时间】:2019-12-27 04:29:09
【问题描述】:

我有以下课程:

private static readonly string ConnectionString = "Dummy";
public static SqlConnection GetConnection()
{
    SqlConnection Connection = new SqlConnection(ConnectionString);
    return Connection;
}

public static SqlDataAdapter GetDataAdapter(string Query)
{
    SqlDataAdapter Adapt = new SqlDataAdapter(Query, GetConnection());
    return Adapt;
}
  • 当 GetConnection() 在我的 SqlDataAdapter 构造函数中作为参数传递时,如何处理实例化的 SqlConnection 对象?
  • 当我在调用 GetDataAdapter() 的方法中处置我的 Adapt 对象时,它会自动处置吗?
  • 如果无法处理,您建议如何处理?

感谢您的帮助。

【问题讨论】:

  • 来自MSDN:“如果SqlConnection 尚未打开,SqlDataAdapter 会打开并关闭它。[...] 如果SqlConnection 已经打开,您必须显式调用Close 或Dispose 来关闭它。 "
  • 除非您将该代码放在 using(SqlConnection Connection = new SqlConnection(connectionString) { };然后使用对象后会自动处理

标签: c# parameters dispose


【解决方案1】:

说明

如果您处置您的SqlDataAdapter ,它也不会处置SqlConnection,因为它不清楚您是否想再次使用该连接。你必须改变你的设计才能完成这项工作。

我建议将SqlConnection 传递给GetDataAdapter 函数。

样本

static void Main(string[] args)
{ 
    using (SqlConnection connection = GetConnection()) 
    {
        using (SqlDataAdapter adapter = GetDataAdapter("YourQuery", connection)) 
        {

        }
        // SqlDataAdapter is disposed
    }
    // SqlConnection is disposed
}

private static readonly string ConnectionString = "Dummy";
public static SqlConnection GetConnection()
{
    SqlConnection Connection = new SqlConnection(ConnectionString);
    return Connection;
}

public static SqlDataAdapter GetDataAdapter(string Query, SqlConnection connection)
{
    SqlDataAdapter Adapt = new SqlDataAdapter(Query, connection);
    return Adapt;
}

【讨论】:

    【解决方案2】:

    不,适配器不会丢弃连接。你至少应该把它改成这样:

    public static SqlDataAdapter GetDataAdapter(SqlConnection connection, string Query)
    {
        SqlDataAdapter Adapt = new SqlDataAdapter(Query);
        Adapt.Connection = connection;
        return Adapt;
    }
    

    并像这样使用它

    using (var connection = GetConnection())
    using (var adapter = GetAdapter(connection, query))
    {
        // do stuff
    }
    

    通过这种方式,您还可以更灵活地传递一些其他连接 - 以防您在某些特殊情况下需要它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 2020-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多