在 F# 中释放 SQLite 资源
Releasing SQLite resources in F#
考虑以下 F# 脚本,它创建了一个简单的 SQLite 数据库和 table,然后应将其删除。然而,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
:https://www.devart.com/dotconnect/sqlite/docs/Devart.Data.SQLite~Devart.Data.SQLite.SQLiteCommand_members.html (via System.ComponentModel.Component
对 command
使用 use
绑定而不是 let
应该可以解决问题。
考虑以下 F# 脚本,它创建了一个简单的 SQLite 数据库和 table,然后应将其删除。然而,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
:https://www.devart.com/dotconnect/sqlite/docs/Devart.Data.SQLite~Devart.Data.SQLite.SQLiteCommand_members.html (via System.ComponentModel.Component
对 command
使用 use
绑定而不是 let
应该可以解决问题。