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 包装器中的关闭连接的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Visual Studio 中的 C# 代码打开和关闭与服务器资源管理器中保存的数据库 (.db) 数据连接的连接?
如何处理 UIViewControllerRepresentable 包装器中的 NavigationLink?