代码之家  ›  专栏  ›  技术社区  ›  Mike Comstock

如何在.NET中关闭OracleConnection

  •  9
  • Mike Comstock  · 技术社区  · 15 年前

    假设我有两个对象:

    OracleConnection connection = new OracleConnection(connectionString);  
    OracleCommand command = new OracleCommand(sql, connection);
    

    要关闭连接或Oracle,必须调用command.dispose()、connection.dispose()或两者都调用吗?

    这足够好吗:

    using(connection)  
    {
        OracleDataReader reader = cmd.ExecuteReader();
        // whatever...
    }
    
    4 回复  |  直到 14 年前
        1
  •  17
  •   John Saunders    15 年前
    using (OracleConnection connection = new OracleConnection(connectionString))
    {
        using (OracleCommand command = new OracleCommand(sql, connection))
        {
            using (OracleDataReader reader = cmd.ExecuteReader())
            {
            }
        }
    }
    

    如果它实现了idisposable,并且您创建了它,那么将它放在using块中。

        2
  •  7
  •   Russ    15 年前

    这两个答案都很有针对性。您总是想对任何IDisposeable对象调用.dispose()。通过包装在“using”中,编译器将始终为您实现try/finialy块。

    请注意,如果要避免嵌套,可以编写如下相同的代码:

     using (OracleConnection connection = new OracleConnection(connectionString))
     using (OracleCommand command = new OracleCommand(sql, connection))
     using (OracleDataReader reader = cmd.ExecuteReader())
        {
            // do something here
        }
    
        3
  •  3
  •   J.W.    15 年前

    这就足够了。using语句将包装dispose语句,因此即使抛出异常,您也是安全的,这是我处理资源的首选方法。

    using(OracleConnection connection = new OracleConnection(connectionString);    )  
    {
       //Create a command object 
        using(OracleCommand command = new OracleCommand(sql, connection))
        {
          using(OracleDataReader reader = cmd.ExecuteReader())
          {
          }
    
        }
        // whatever...
    }
    

    我认为使用“using”是要求编译器注入一个尝试…finally block,在finally block中,它将为您关闭一次性对象。

        4
  •  3
  •   Aaron Daniels    15 年前

    using 将确保您的连接已关闭。你也可以进去 CommandBehavior.CloseConnection 听从你的命令 ExecuteReader 之前关闭它的方法 Dispose 被称为。