说我有这两个对象:
OracleConnection connection = new OracleConnection(connectionString);
OracleCommand command = new OracleCommand(sql, connection);
要关闭连接或Oracle,我是否必须调用command.Dispose(),connection.Dispose()或两者?
这是否足够好:
using(connection)
{
OracleDataReader reader = cmd.ExecuteReader();
// whatever...
}
答案 0 :(得分:17)
using (OracleConnection connection = new OracleConnection(connectionString))
{
using (OracleCommand command = new OracleCommand(sql, connection))
{
using (OracleDataReader reader = cmd.ExecuteReader())
{
}
}
}
如果它实现了IDisposable,并且如果你创建它,那么将它放在一个使用块中。
答案 1 :(得分:7)
这两个答案都非常符合目标。您总是希望在任何IDisposeable对象上调用.Dispose()。通过包装在“使用”中,您可以使编译器始终为您提供try / finialy块。
1点注意,如果你想避免嵌套,可以像这样编写相同的代码:
using (OracleConnection connection = new OracleConnection(connectionString))
using (OracleCommand command = new OracleCommand(sql, connection))
using (OracleDataReader reader = cmd.ExecuteReader())
{
// do something here
}
答案 2 :(得分:3)
这很好。 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”,你要求编译器注入一个try ... finally块,在finally块中,它会为你关闭一次性对象。
答案 3 :(得分:3)
using
将确保您的连接已关闭。您也可以将CommandBehavior.CloseConnection
传递到命令的ExecuteReader
方法,以便在调用Dispose
之前将其关闭。