配置连接、命令、适配器
Disposing connection, command, adapter
当我从我的 C# 代码查询数据库时,我通常使用类似这样的结构:
using (var connection = new OleDbConnection(connStr))
using (var command = new OleDbCommand(query, connection))
using (var adapter = new OleDbDataAdapter(command))
{///}
我应该实际使用所有这些 'using' 还是仅处理连接就足够了,所有相关对象也将被处理?
it will be enough to dispose only connection and all related objects
will be disposed too?
没有。处置连接只会处置连接对象。
通常,销毁每个实现 IDisposable
的对象是一种安全的做法。 (还有一点,处理Command
对象不会处理相关的连接对象)
仅使用语句配置包含的实例。它不会影响相关的其他对象。
你在你的情况下使用了正确的方法。
using (var connection = new OleDbConnection(connStr))
using (var command = new OleDbCommand(query, connection))
using (var adapter = new OleDbDataAdapter(command))
{
} // <-- Both connection, command and adapter disposed here
简短回答:不,这只会处理您的连接对象。因此,您需要所有这些 using
。
Long(er) 答案:在 using
语法后面,编译器创建一个范围,在该范围内创建变量(变量不存在于 using
范围之外)和Dispose
方法将在退出 using
作用域时被调用。
因此,如果您不在 using
块中创建 command
变量,则不会调用 Dispose
方法,因此不会释放该对象。 (除非你决定自己打电话给 command.Dispose()
)
当我从我的 C# 代码查询数据库时,我通常使用类似这样的结构:
using (var connection = new OleDbConnection(connStr))
using (var command = new OleDbCommand(query, connection))
using (var adapter = new OleDbDataAdapter(command))
{///}
我应该实际使用所有这些 'using' 还是仅处理连接就足够了,所有相关对象也将被处理?
it will be enough to dispose only connection and all related objects will be disposed too?
没有。处置连接只会处置连接对象。
通常,销毁每个实现 IDisposable
的对象是一种安全的做法。 (还有一点,处理Command
对象不会处理相关的连接对象)
仅使用语句配置包含的实例。它不会影响相关的其他对象。
你在你的情况下使用了正确的方法。
using (var connection = new OleDbConnection(connStr))
using (var command = new OleDbCommand(query, connection))
using (var adapter = new OleDbDataAdapter(command))
{
} // <-- Both connection, command and adapter disposed here
简短回答:不,这只会处理您的连接对象。因此,您需要所有这些 using
。
Long(er) 答案:在 using
语法后面,编译器创建一个范围,在该范围内创建变量(变量不存在于 using
范围之外)和Dispose
方法将在退出 using
作用域时被调用。
因此,如果您不在 using
块中创建 command
变量,则不会调用 Dispose
方法,因此不会释放该对象。 (除非你决定自己打电话给 command.Dispose()
)