2013-03-14 91 views
4

如何对待SQLiteCommand对象, 我ExecuteScalarExecuteNonQueryExecuteReader或没有通话Dispose()我是否必须配置SQLiteCommand对象?

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

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

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

+6

凭经验更频繁地出现一种倾向:如果是一次性的,处理它,当你不再需要它。 – Corak 2013-03-14 11:42:04

回答

7

最好的做法是在完成后尽快实施IDisposable,因为它可能会使用非托管资源。

这应该用using-statement来完成,因为它包装了使用这个对象的代码,并且因为它也在出现异常时处置它。

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

的只是这样做:

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

不调用处理的命令不会做任何事情太糟糕了。然而,调用Dispose将禁止对终结器的调用,使调用处理性能得到提升。

+2

它似乎**确实**做坏事。虽然我不确定为什么。只是重构我的DAO,并期望问题消失(我讨厌这种魔法,但在这种情况下,我不想挖掘SQLite源) – Odys 2013-03-14 12:49:17

2

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

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

所以它会自动离开使用范围的配置时使用。

1

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

这种1英寸-100病例有比人会认为

相关问题