在sqlite连接关闭并重新打开后,插入或更新查询不起作用-WP8C#
本文关键字:插入 更新 查询 -WP8C# 不起作用 新打开 连接 sqlite | 更新日期: 2023-09-27 17:59:02
我有一个DBManager类,它实现IDisposable接口。该类有一个sql_conn
变量。它有一个OpenConnection函数,可以创建一个新的连接。该类还具有创建表格、更新记录等功能。
public DBManager()
{
sql_conn = new SQLiteConnection("MyDB.db");
}
public void Dispose()
{
sql_conn.Dispose();
}
每次我需要更新一些值时,我都会创建一个DBMan对象并打开连接
using (DBManager dbMan = new DBManager())
{
dbMan.OpenConnection();
dbMan.InsertIntoDB(val1, val2);
}
由于DBManager已经实现了IDisposable,所以它会在using语句完成后处理sql_conn
。
我现在面临的问题是,在其中一个类中,我需要根据某些检查更新同一行的几个值。
void SaveValues
{
save1();
save2();
save3();
}
在save1中,我打开连接,更新记录并关闭连接在save2中,我打开连接并更新记录,然后关闭。
public void save1()
{
using (DBManager dbMan = new DBManager())
{
dbMan.OpenConnection();
if(//check)
{
dbMan.InsertIntoDB(val1, val2);// update query is used
}
}
}
public void save2()
{
using (DBManager dbMan = new DBManager())
{
dbMan.OpenConnection();
if(//check)
{
dbMan.InsertIntoDB(val3, val4);
}
}
}
Save1有效,并且该值在数据库中更新。但save2不是。该函数不会抛出错误,但不会更新数据库中的值。
知道为什么不起作用吗?
在SQLite.Net中,执行Dispose the SQLiteConnection
的代码如下所示:
public void Dispose ()
{
Dispose (true);
GC.SuppressFinalize (this);
}
protected virtual void Dispose (bool disposing)
{
Close ();
}
public void Close ()
{
if (_open && Handle != NullHandle) {
try {
if (_mappings != null) {
foreach (var sqlInsertCommand in _mappings.Values) {
sqlInsertCommand.Dispose();
}
}
var r = SQLite3.Close (Handle);
if (r != SQLite3.Result.OK) {
string msg = SQLite3.GetErrmsg (Handle);
throw SQLiteException.New (r, msg);
}
}
finally {
Handle = NullHandle;
_open = false;
}
}
}
在MSDN中,SuppressFinalize执行以下操作:
请求公共语言运行库不调用指定对象的终结器。
因此,我不确定这是否是对象看起来仍然打开的原因,从而使您自己的Dispose函数强制GC收集GC.Collect();
应该完成或关闭对象。
从类似的问题
当您调用SQLiteConnection.Close()时,会发生(连同一些检查和其他事情)指向SQLite数据库实例的SQLiteConnectionHandle被释放。这是通过调用SQLiteConnectionHandle.Dispose()来完成的,但是,在CLR的垃圾收集器执行一些垃圾收集之前,这实际上不会释放指针。由于SQLiteConnectionHandle重写CriticalHandle.ReleaseHandle()函数来调用sqlite3_close_interop()(通过另一个函数),因此不会关闭数据库。
希望这能有所帮助。