我需要处理SQLiteCommand对象吗?

6
我该如何处理 `SQLiteCommand` 对象,我在调用 `ExecuteScalar`、`ExecuteNonQuery` 和 `ExecuteReader` 之后是否需要调用 `Dispose()` 方法?
SQLiteCommand 的文档示例中没有释放它,而在 SQLiteTransaction 的示例中却释放了 `SQLiteCommand` 对象。
尽管如此,我总是关闭数据读取器对象。我的应用程序从多个线程访问数据库。
我最关心的是不泄露连接或干扰 SQLite,我知道 `using` 和 `IDisposable` 的使用方法。

6
经验法则:如果是一次性使用的物品,在你不再需要它时就应该处理掉。 - Corak
4个回答

10

最佳实践是尽快处理所有实现了 IDisposable 接口的内容,因为它可能会使用非托管资源。

这应该使用 using 语句 来完成,因为它包装了使用此对象的代码,并在发生异常时也进行了处理。

using(var con = new SQLiteConnection(conString))
using(var cmd = new SQLiteCommand(con))
{
    con.Open();
    // ...
} // also closes the connection

2
如果是一次性的,请在使用后丢弃。最好的方法是,尽可能地重复使用。
using(SQLiteCommand cmd as new SQLiteCoammand())
{
   ...
}

因此,当离开使用范围时,它将自动处理。


1

只需要这样做:

using(var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString))
using(var command = connection.CreateCommand())
{
   command.CommandText = "...";
   connection.Open();
   command.ExecuteNonQuery();
}

不调用命令的dispose方法也不会有太大问题。但是调用Dispose方法将抑制对终结器的调用,使调用dispose成为性能增强。


2
似乎它确实会做一些坏事,尽管我不太确定为什么。只需重构我的数据访问对象(DAO),就可以期望问题消失(我不喜欢这种神秘的情况,但在这种情况下,我不想深入挖掘SQLite源代码)。 - Odys

1
使用using语句将在对象调用Close()的代码被绕过时调用Dispose,即使发生异常。这样,您就不必编写try/finally块来关闭读取器或连接。您还可以避免忘记编写正确的finally块的1-in-100情况。
这种1-in-100的情况往往比人们想象的更频繁发生。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接