1

考虑以下 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 对象?

4

1 回答 1

3

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

使用usebinding 而不是letforcommand应该可以解决问题。

于 2015-06-04T23:09:29.613 回答