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