【问题标题】:Do I have to Dispose the SQLiteCommand objects?我必须处置 SQLiteCommand 对象吗?
【发布时间】:2013-03-14 11:39:10
【问题描述】:

我如何处理SQLiteCommand 对象, 我是否必须ExecuteScalarExecuteNonQueryExecuteReader 之后调用Dispose()

SQLiteCommand 上的文档示例不会处理它,而 在SQLiteTransaction 中的示例处理了 SQLiteCommand 对象。

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

主要是我对不泄漏连接或不干扰 SQLite 感兴趣。我知道usingIDisposable 的用法

【问题讨论】:

  • 经验法则:如果是一次性的,请在不再需要时丢弃。

标签: c# sqlite .net-3.5 system.data.sqlite


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      这样做:

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

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

      【讨论】:

      • 它似乎确实确实做了坏事。虽然我不太确定为什么。只是重构我的 DAO 并期望问题消失(我讨厌这种魔法,但在这种情况下我不想深入研究 SQLite 源代码)
      【解决方案4】:

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

      这种情况的发生频率比人们想象的要高得多

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多