F# 如何使用Expr用法中的参数 让我们使用连接表达式= let Expr(连接:MySqlConnection)= 尝试 尝试 康涅狄格州公开赛 具有 | :? MySqlException作为ex ->printfn“异常!%s”ex.消息 出口(康涅狄格州) 最后 尝试 连接关闭()|>忽略 具有 | :? MySqlException作为ex ->printfn“异常!%s”ex.消息 使用(新的MySqlConnection)(ConnectionString= “server=“+MySQLServer+”; uid=“+MySQLUID+”; pwd=“+MySQLPW+”; database=“+MySQLDB+”; 字符集=utf8;“”)Expr 成员x.reportToDB(消息:字符串)= useConnection/
F# 如何使用Expr用法中的参数 让我们使用连接表达式= let Expr(连接:MySqlConnection)= 尝试 尝试 康涅狄格州公开赛 具有 | :? MySqlException作为ex ->printfn“异常!%s”ex.消息 出口(康涅狄格州) 最后 尝试 连接关闭()|>忽略 具有 | :? MySqlException作为ex ->printfn“异常!%s”ex.消息 使用(新的MySqlConnection)(ConnectionString= “server=“+MySQLServer+”; uid=“+MySQLUID+”; pwd=“+MySQLPW+”; database=“+MySQLDB+”; 字符集=utf8;“”)Expr 成员x.reportToDB(消息:字符串)= useConnection/,f#,F#,useConnection似乎需要一个采用MySqlConnection的函数。它为该函数提供所需的连接对象 解决办法是: let useConnection expr = let Expr(conn : MySqlConnection) = try try conn.Open() with | :? MySqlException as ex
useConnection
似乎需要一个采用MySqlConnection
的函数。它为该函数提供所需的连接对象
解决办法是:
let useConnection expr =
let Expr(conn : MySqlConnection) =
try
try
conn.Open()
with
| :? MySqlException as ex
-> printfn "Exception! %s" ex.Message
expr(conn)
finally
try
conn.Close() |> ignore
with
| :? MySqlException as ex
-> printfn "Exception! %s" ex.Message
using (new MySqlConnection(ConnectionString =
"server = " + MySQLServer + ";
uid = " + MySQLUID + ";
pwd = " + MySQLPW + ";
database = " + MySQLDB + ";
Charset=utf8;")) Expr
member x.reportToDB (msg:string) =
useConnection // <--- SO HERE I WANT TO KNOW WHAT IS conn
(let cmd = new MySqlCommand(Connection = conn)
cmd.CommandText <- ("insert into "+MySQLTable+"(system,dt,logMessage);")
ignore <| cmd.Parameters.AddWithValue("?system", Net.Dns.GetHostName())
ignore <| cmd.Parameters.AddWithValue("?dt", DateTime.Now.ToString() )
ignore <| cmd.Parameters.AddWithValue("?logMessage", msg )
try
try
cmd.ExecuteNonQuery() |> ignore
with
| :? MySqlException as ex when ex.Message.Contains("Duplicate entry")
-> printfn "MySQL Duplicate entry Exception: discarding the data set! %s" ex.Message
printfn ""
| :? MySqlException as ex
-> printfn "MySQL Exception, requeing data set and trying again later! %s" ex.Message
reraise()
with
| :? MySqlException as ex
-> printfn "Exception! %s" ex.Message)
编辑:在useConnection
函数中添加类型注释可能会更清晰:
useConnection (fun conn (* here's your connection *) ->
let cmd = new MySqlCommand(Connection = conn)
// etc.
这段代码目前看起来不像是编译的-我认为第一行不应该缩进,并且注释后的代码需要是lambda函数lamba是个好主意:)。您当前没有使用它们。您将它们插入了
useConnection
函数中,但没有在x.reportToDB
中检索它们。如果你编译你的代码,你应该在底部的大块中得到一个语法错误。但是你的代码能像我希望的那样工作吗?我的意思是我仍然对这个有趣的conn->你对fun
关键字感到困惑吗?它允许您编写函数,而无需给函数命名。以下是MSDN的解释:
let useConnection (expr : MySqlConnection -> 'a) : 'a =
let Expr(conn : MySqlConnection) : 'a =
// etc.