在F中释放SQLite资源#
考虑下面的F#脚本,它创建了一个简单的SQLite数据库和表,然后应该删除它。但是,SQLite obejct似乎没有被正确地处理,也没有释放其对文件的锁定在F中释放SQLite资源#,sqlite,f#,system.data.sqlite,fsi,Sqlite,F#,System.data.sqlite,Fsi,考虑下面的F#脚本,它创建了一个简单的SQLite数据库和表,然后应该删除它。但是,SQLite obejct似乎没有被正确地处理,也没有释放其对文件的锁定 #r@“C:\Path\To\System.Data.SQLite.dll” open System.Data.SQLite 让createTable() 使用db=newsqliteconnection(@“Data Source=test.sqlite”) db.Open() let command=new SQLiteCommand(
#r@“C:\Path\To\System.Data.SQLite.dll”
open System.Data.SQLite
让createTable()
使用db=newsqliteconnection(@“Data Source=test.sqlite”)
db.Open()
let command=new SQLiteCommand(“创建表测试项(ColA ColB)”,db)
command.ExecuteNonQuery()|>忽略
db.Close()
createTable()
//System.IO.IOException:进程无法访问文件“[…]\test.sqlite”
//因为它正被另一个进程使用。
System.IO.File.Delete(“test.sqlite”)
我在F#方面相当差劲,但我对use
的理解是,对象的资源在超出范围时将被处置,但在本例中似乎并非如此。我尝试调用Dispose()
,但也没有效果
有人能告诉我如何在F#中正确处理SQLite对象吗 还需要处理
SQLiteCommand
,因为它还根据文档实现了IDisposable
:
使用
use
binding而不是let
forcommand
应该可以解决这个问题。不SQLiteCommand
也实现IDisposable
吗?在这种情况下,您还应该使用use
binding而不是let
。这就是问题所在!假设这是一个F#问题,但实际上是个m问题y对System.Data.SQLite一无所知。如果你发布了一个答案,我会很高兴地将其标记为已接受。@user1393477我发现的一个避免这种情况的有效方法是只将new
与use
一起使用,如果你没有为实现IDisposable
的类指定new
,你会得到一个警告