我正在编写一些控制台应用程序来在SQLite数据库之间移动一些数据。连接类和各种预准备语句实现了IDisposable,所以我使用using
块来实例化这些对象,如下所示:
using (SQLiteConnection sqlite_conn = new SQLiteConnection(connectionString))
{
sqlite_conn.Open();
using (SQLiteCommand sqlite_cmd = new SQLiteCommand())
{
sqlite_cmd.Connection = sqlite_conn;
sqlite_cmd.CommandText = "INSERT INTO SOMETHING SOMETHING;";
sqlite_cmd.ExecuteNonQuery();
}
sqlite_conn.Close();
}
但是,我需要能够在一个方法中创建这些连接,然后在其他方法中调用它们。将这些连接存储为实例变量的最简洁,最混乱的方法是什么?我想确保以智能方式调用他们的.Dispose()
方法,但是看不到确保所有操作都在单个using
块的上下文中发生的好方法。
我意识到这是一个C#newb问题所以请定制你的答案。如果你有一个建议的解决方案,我会喜欢它,如果你包括一个代码示例来说明。
编辑:我的用例是一个控制台应用。有人传入源和目标连接字符串,控制台应用程序执行操作。我真的会让我的控制台类程序本身实现这样的IDisposable吗?:
class Program : IDisposable
{
private SQLiteConnection sourceConnection;
private SQLiteConnection destinationConnection;
public void Dispose()
{
sourceConnection.Dispose();
destinationConnection.Dispose();
}
}
答案 0 :(得分:2)
我需要能够在一个方法中创建这些连接,然后在其他方法中调用它们。将这些连接存储为实例变量的最简洁,最简单的方法是什么?
在这种情况下,保存这些实例变量的类本身应该实现IDisposable,并且在处理时应确保连接也被处理掉。
此外,当您同时拥有多个IDisposable时,您可以通过这种方式重新编写它,对它们进行分组并减少代码中的嵌套:
using (SQLiteConnection sqlite_conn = new SQLiteConnection(connectionString))
using (SQLiteCommand sqlite_cmd = new SQLiteCommand())
{
sqlite_conn.Open();
sqlite_cmd.Connection = sqlite_conn;
sqlite_cmd.CommandText = "INSERT INTO SOMETHING SOMETHING;";
sqlite_cmd.ExecuteNonQuery();
} // no need to call .Close(): IDisposable normally handles it for you
答案 1 :(得分:1)
您可以使您的类实现IDisposable并确保在Dispose方法中清理连接等。然后调用你的类的方法可以使用(MyClass c ...)。
答案 2 :(得分:1)
一种方法是让您的类实现IDisposable。在类的Dispose方法中,调用连接的Dispose方法和命令等。然后,您可以在using块中使用类的实例。