我正在尝试将System.Data.Sqlite
与F#一起使用。在C#中,我有像
using (DbTransaction dbTrans = con.BeginTransaction()) {
using (SQLiteCommand cmd = con.CreateCommand()) {
//blahblah
}
dbTrans.Commit();
}
但是在F#中,当我使用上面类似的两个using
时,我得到the type bool is not compatible with the type IDisposable
的错误...
编辑我真的很抱歉我的问题。 use
适用于F#案例。我只是不知道如何关闭/删除我的问题。
答案 0 :(得分:15)
添加一些细节 - 如果您需要明确标记命令有效的范围(以获得与C#示例完全相同的行为,在调用cmd
之前处理Commit
id的位置)你可以写:
use dbTrans = con.BeginTransaction()
( use cmd = con.CreateCommand()
cmd.BlahBlahBlah() )
dbTrans.Commit()
范围只是定义符号的表达式的一部分,因此您可以使用括号将其显式化。
using
只是一个F#函数,您可以在添加use
的特殊语法之前使用它。仅供参考,语法如下:
using (con.BeginTransaction()) (fun dbTrans ->
using (con.CreateCommand()) (fun cmd ->
cmd.BlahBlahBlah() )
dbTrans.Commit() )
使用use
编写代码绝对是一个更好的主意(但您可以定义像using
这样的函数来封装更有趣的行为 - 例如事务)。
答案 1 :(得分:9)
在f#中
use dbTrans = new con.BeginTransaction ()
和
use cmd = con.CreateCommand()
这些将在你的功能结束时处理