6

我如何对待SQLiteCommand对象,我是否必须在Dispose()之后调用ExecuteScalarExecuteNonQuery或者ExecuteReader不?

SQLiteCommand上的文档示例没有处理它,而在SQLiteTransaction中,该示例处理了 SQLiteCommand 对象。

不过,我总是关闭数据读取器对象。我的应用程序从许多线程访问数据库。

大多数情况下,我对不泄漏连接或不干扰 SQLite 感兴趣。我知道usingIDisposable使用

4

4 回答 4

10

最好的做法IDisposable是在完成后立即处理所有实现的内容,因为它可能会使用非托管资源。

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

using(var con = new SQLiteConnection(conString))
using(var cmd = new SQLiteCommand(con))
{
    con.Open();
    // ...
} // also closes the connection
于 2013-03-14T11:41:31.517 回答
2

如果它是一次性的,如果您不再使用它,请将其丢弃。最好的方法是使用 using

using(SQLiteCommand cmd as new SQLiteCoammand())
{
   ...
}

所以它会在离开使用范围时自动释放。

于 2013-03-14T11:43:08.740 回答
1

只需这样做:

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

不在命令上调用 dispose 不会做任何坏事。但是,在其上调用 Dispose 将抑制对终结器的调用,从而使调用 dispose 提高性能。

于 2013-03-14T11:41:03.437 回答
1

即使发生绕过调用 Close() 的代码的异常,using 语句也会对对象调用 Dispose。这样您就不必编写 try/finally 块来关闭阅读器或连接。您还可以避免这种您忘记编写正确的 finally 块的 100 分之一的情况。

这样的 100 例中的​​ 1 例往往比人们想象的更频繁地发生

于 2013-03-14T11:52:00.290 回答