考虑以下F#脚本,它创建一个简单的SQLite数据库和表,然后删除它。但是,SQLite obejct似乎没有被正确处理,也没有释放它对文件的锁定。
#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对象吗?
答案 0 :(得分:3)
SQLiteCommand
也需要处理,因为它还会根据文档https://www.devart.com/dotconnect/sqlite/docs/Devart.Data.SQLite~Devart.Data.SQLite.SQLiteCommand_members.html(通过System.ComponentModel.Component
IDisposable
对use
使用let
绑定代替command
可以解决问题。