在SQLite-WinRT包装器中关闭连接

时间:2016-03-03 10:39:20

标签: c# windows sqlite windows-runtime windows-8.1

如何关闭SQLite-WinRT wrapper中的所有数据库连接。我需要删除sqlite数据库,但在删除时抛出异常Access is denied,因为某些连接已经在使用数据库。所以我需要在删除之前关闭所有连接。

我尝试过处理数据库,如:

var dbFile = await StorageFile.GetFileFromPathAsync(dbPath);
db = new SQLiteWinRT.Database(dbFile); 
db.Dispose();

但它不起作用并抛出相同的异常。

谢谢!

3 个答案:

答案 0 :(得分:1)

using {...}块内执行面向数据库的操作。

  

using语句获取一个或多个资源,执行语句,然后处置资源。

示例:

using (var db = new SQLiteConnection(DbPath))
{
    db.Trace = true;
    db.Execute("DELETE FROM Person WHERE Id = ?", person.Id);
}

答案 1 :(得分:1)

有时SQLite无法正确处置。要解决此问题,您可以在垃圾收集器上调用Collect

示例

var dbFile = await StorageFile.GetFileFromPathAsync(dbPath);
db = new SQLiteWinRT.Database(dbFile); 
db.Dispose();

// Then force GC
GC.Collect();

如果这对您不起作用,请参阅此SO question以获取其他替代解决方案。

答案 2 :(得分:1)

我遇到了同样的问题。就我而言,我没有正确处理准备好的陈述。每次致电PrepareStatementAsync时,您都必须在结果声明中致电Dispose(或使用using)。