Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在不使用.NET显式调用Close方法的情况下关闭Sqlite连接_C#_.net_Sqlite_Database Connection_System.data.sqlite - Fatal编程技术网

C# 如何在不使用.NET显式调用Close方法的情况下关闭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()(

我正在winform中创建使用Sqlite数据库的桌面应用程序

所以我创建了使用
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()
会让人感觉有些错误和不对称。。。