C# 如何在不使用.NET显式调用Close方法的情况下关闭Sqlite连接
我正在winform中创建使用Sqlite数据库的桌面应用程序 所以我创建了使用C# 如何在不使用.NET显式调用Close方法的情况下关闭Sqlite连接,c#,.net,sqlite,database-connection,system.data.sqlite,C#,.net,Sqlite,Database Connection,System.data.sqlite,我正在winform中创建使用Sqlite数据库的桌面应用程序 所以我创建了使用System.Data.Sqlite的Sqlite助手类,该助手类的每个方法都打开和关闭连接 但现在我还添加了附加数据库的功能,但在连接关闭后,所有附加的数据库都会丢失 为了纠正这个问题,我修改了这个类,以便在构造函数中打开连接并保持打开状态 在应用程序结束后,我希望在不显式调用close方法的情况下关闭该连接 有什么建议吗?根据类的定义,您可以使用Dispose或析构函数。或者,在程序结束时显式调用Close()(
System.Data.Sqlite
的Sqlite助手类,该助手类的每个方法都打开和关闭连接
但现在我还添加了附加数据库的功能,但在连接关闭后,所有附加的数据库都会丢失
为了纠正这个问题,我修改了这个类,以便在构造函数中打开连接并保持打开状态
在应用程序结束后,我希望在不显式调用close方法的情况下关闭该连接
有什么建议吗?根据类的定义,您可以使用Dispose或析构函数。或者,在程序结束时显式调用Close()(从Main内部,运行后…。在C中,这种情况有一种特殊的语法:
using(var connection = new Connection())
{
//work with connection
}
它编译成如下内容:
Connection connection = null;
try
{
connection = new Connection();
//your operations
}
finally
{
connection.Dispose();
}
调用Dispose()时,您将关闭连接。在应用程序的生命周期内保持连接打开不是一个好办法。
我建议不要走这条路。
相反,我将尝试将附加数据库的功能封装到一个方法中,该方法可以根据需要调用 例如:
private static void AttachDB(string fileDB, string aliasName, SQLiteConnection cn)
{
string sqlText = string.Format("ATTACH '{0}' AS {1}", fileDB, aliasName)
SQLiteCommand cmd = new SQLiteCommand(sqlText, cn)
cmd.ExecuteNonQuery();
}
然后在代码中
using(SQLiteConnection cn = new SQLiteConnection(GetConnectionString()))
{
AttachDB(@"C:\SQLite\UserData.sqlite3", "UserData", cn);
// Do your code here
}
Close
不应断开数据库连接,但这仅在启用.NET连接池机制时有效。确保已在连接字符串中启用该选项:
Data Source=filename;Version=3;Pooling=True;Max Pool Size=100;
您可以使用
使用statement@NikhilAgrawal-这将是一个小写的u
。不确定如何创建帮助类,因为帮助类是在Form_load事件中创建的,并且应用程序在应用程序的生命周期中使用该类。@Oded:谢谢了吗?我请您投票结束我的问题@NikhilAgrawal-我已经说过了有。而且你知道-你可以自己标记这个问题以引起主持人的注意,要求他们删除它。Dispose And Destructor听起来像是我需要的。我应该用哪一个?就像我说的,取决于你们班上已经有了什么。阅读,并帮助您做出决定。您的意思是让连接尽可能短地打开,并且在打开连接后我附加数据库吗?是的,让连接在最短的时间内保持打开状态。这是一般规则。NET使用,以避免每次重新初始化连接的成本。但是,SQlite默认情况下不启用它。使用如下连接字符串Data Source=filename;版本=3;池=真;最大池大小=100代码>。我也想到了这一点,但每次使用sqlite方法重新连接数据库的成本似乎更高。但是,您需要对附加数据库所需的时间进行基准测试。另外,您是否尝试过在连接池处于活动状态时数据库是否同样丢失?只需在连接池处于活动状态时尝试,即可正常工作。连接的数据库没有丢失。谢谢。不完全正确-在实例化连接之后,它还没有打开-您仍然需要调用open()
。但是,这样做时,在Dispose()
之前不调用Close()
会让人感觉有些错误和不对称。。。