2011-02-11 73 views
14

我想用F#使用System.Data.Sqlite。在C#中,我有一个像f#关键字的使用和使用

using (DbTransaction dbTrans = con.BeginTransaction()) { 
    using (SQLiteCommand cmd = con.CreateCommand()) { 
     //blahblah 
    } 
    dbTrans.Commit(); 
} 

但在F#代码,当我使用similiar 2 using上面我的the type bool is not compatible with the type IDisposable错误... 编辑我为我的问题真的很抱歉。 use将在F#的情况下工作。我只是不知道如何关闭/删除我的quesetions。

+4

我不知道你是否真的需要删除这个问题。这不是一个坏问题:它得到了赞赏,还有两个体面的答案。 – Benjol 2011-02-14 06:40:29

回答

8
在F#

use dbTrans = new con.BeginTransaction() 

use cmd = con.CreateCommand() 

当你的函数结束

15

要添加一些细节,这些将部署 - 如果你需要一个命令是有效的显式标记范围(以获得与您的C#示例中完全相同的行为,其中cmd id在致电Commit之前已处理),您可以编写:

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的功能封装更有趣的行为 - 例如交易)。