在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连接关闭并重新打开后,插入或更新查询不起作用-WP8C#

在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()(通过另一个函数),因此不会关闭数据库。

希望这能有所帮助。