【问题标题】:Releasing SQLite resources in F#在 F# 中释放 SQLite 资源
【发布时间】:2015-06-04 22:24:35
【问题描述】:

考虑以下 F# 脚本,该脚本创建一个简单的 SQLite 数据库和表,然后应该将其删除。但是,SQLite 对象似乎没有被正确处理,并且没有释放它对文件的锁定。

#r @"C:\Path\To\System.Data.SQLite.dll"

open System.Data.SQLite

let createTable() = 
    use db = new SQLiteConnection(@"Data Source=test.sqlite")
    db.Open()
    let command = new SQLiteCommand("CREATE TABLE TestItems (ColA ColB)", db)
    command.ExecuteNonQuery() |> ignore
    db.Close()

createTable()

// System.IO.IOException: The process cannot access the file '[...]\test.sqlite' 
// because it is being used by another process.
System.IO.File.Delete("test.sqlite")

我在 F# 方面很差,但我对use 的理解是对象的资源会在超出范围时被处理掉,但在这种情况下似乎并非如此。我也试过打电话给Dispose(),也无济于事。

谁能解释我如何在 F# 中正确处理 SQLite 对象?

【问题讨论】:

  • SQLiteCommand 不是也实现了IDisposable 吗?在这种情况下,您还应该使用use 绑定而不是let
  • 这就是问题所在!假设这是一个 F# 问题,而是我对 System.Data.SQLite 的无知。如果您发布答案,我很乐意将其标记为已接受。
  • @user1393477 我发现避免这种情况的一个有用方法是只使用newuse,如果你没有为实现IDisposable 的类指定new 你'会收到警告

标签: sqlite f# system.data.sqlite fsi


【解决方案1】:

SQLiteCommand 也需要处理,因为它还根据文档实现了IDisposablehttps://www.devart.com/dotconnect/sqlite/docs/Devart.Data.SQLite~Devart.Data.SQLite.SQLiteCommand_members.html(通过System.ComponentModel.Component

使用use 绑定而不是let 绑定command 应该可以解决问题。

【讨论】:

    猜你喜欢
    • 2011-02-15
    • 2012-01-08
    • 2012-05-04
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多