【问题标题】:Close connection in SQLite-WinRT wrapperSQLite-WinRT 包装器中的关闭连接
【发布时间】: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();

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

谢谢!

【问题讨论】:

    标签: c# windows sqlite windows-runtime windows-8.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】:

      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)。

      【讨论】:

        猜你喜欢
        • 2014-07-24
        • 2017-08-12
        • 2010-09-10
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-13
        相关资源
        最近更新 更多