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

Posted

技术标签:

【中文标题】SQLite-WinRT 包装器中的关闭连接【英文标题】:Close connection in SQLite-WinRT wrapper 【发布时间】:2016-06-16 15:20:24 【问题描述】:

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

我尝试过像这样处理数据库:

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

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

谢谢!

【问题讨论】:

【参考方案1】:

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

示例

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

// Then force GC
GC.Collect();

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

【讨论】:

【参考方案2】:

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

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

例子:

using (var db = new SQLiteConnection(DbPath))

    db.Trace = true;
    db.Execute("DELETE FROM Person WHERE Id = ?", person.Id);

【讨论】:

您好,M. Hassan,感谢您的回答。不同部分有很多数据库操作,并且每次在 using . . . 块内传递 DbPath 作为参数并创建新实例对我来说似乎不可行。有什么你能想到的选择吗? 害怕这种情况。您需要以一种或另一种方式进行更改。连接池可能会有所帮助。【参考方案3】:

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

【讨论】:

以上是关于SQLite-WinRT 包装器中的关闭连接的主要内容,如果未能解决你的问题,请参考以下文章

sql “表单”构建器中的确认,取消和关闭按钮

如何使用 Visual Studio 中的 C# 代码打开和关闭与服务器资源管理器中保存的数据库 (.db) 数据连接的连接?

如何处理 UIViewControllerRepresentable 包装器中的 NavigationLink?

OpenGL 包装器中的 Alpha/纹理问题

如何从 vue-fullpage 包装器中的子组件调用 fullpagejs 方法?

如何在 API 中隐藏迭代器以使用 std::map 包装器中的项目