【发布时间】: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 我发现避免这种情况的一个有用方法是只使用
new和use,如果你没有为实现IDisposable的类指定new你'会收到警告
标签: sqlite f# system.data.sqlite fsi