我知道我需要使用use关键工作处理资源:
use db = new dbml.MobileDataContext(connectionString)
for rows in db.Item do
....
Run Code Online (Sandbox Code Playgroud)
但我想创建返回数据库连接的函数:
let getConnection(connectionString) =
use db = new dbml.MobileDataContext(connectionString)
db.ExecuteCommand(....) |> ignore
db
Run Code Online (Sandbox Code Playgroud)
并在我的代码中使用此函数:
use db = getConnection(connectionString)
for rows in db.Item do
....
Run Code Online (Sandbox Code Playgroud)
我是否需要use在这种情况下使用-keyword两次:在函数和函数调用中?
您应该只use在外部函数中使用.如果你在里面使用它getConnection,那么你的上下文将在返回时被处理getConnection,因此当你想要使用它时它将被放置在外部函数中.作为一般规则,如果在函数中处理值,则不得返回它.
@Tarmil有正确的答案,但我也想指出一个更惯用的替代方法来返回已经打开的连接.
您可以改为定义一个withConnection以函数作为参数的高阶函数.您传入的函数将接受打开的连接并返回它想要的任何结果,让withConnection处理连接的处理.这是样板:
let withConnection f =
use db = new dbml.MobileDataContext(connectionString)
db.ExecuteCommand(....) |> ignore
f db
Run Code Online (Sandbox Code Playgroud)
然后,您可以像这样使用它,而不必担心从代码中的其他位置关闭连接:
let users = withConnection (fun conn -> conn.ExecuteQuery(...))
Run Code Online (Sandbox Code Playgroud)