在F#中发布SQLite资源

时间:2015-06-04 22:24:35

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

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

1 个答案:

答案 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可以解决问题。