Как использовать параметр из использования Expr - PullRequest
0 голосов
/ 13 декабря 2010
    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)

Сложно объяснить, но я хочу использовать делегат conn из useConnection в x.reportToDB, как я могу это сделать?

спасибо.

@ Тим Робинсон, да, я не знаю о Конне, и это проблема, которую я хочу решить, почему вы думаете, что лямбда-это плохая идея здесь?

1 Ответ

1 голос
/ 13 декабря 2010

useConnection, кажется, хочет функцию, которая принимает MySqlConnection. Он предоставляет эту функцию нужному объекту соединения.

Исправление:

useConnection (fun conn (* here's your connection *) ->
   let cmd = new MySqlCommand(Connection = conn)
   // etc.

Редактировать: Возможно, это будет понятнее, если добавить аннотации к функции useConnection:

let useConnection (expr : MySqlConnection -> 'a) : 'a =
    let Expr(conn : MySqlConnection) : 'a =
    // etc.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...