2010-12-13 43 views
0
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) 

Il est difficile à expliquer mais je veux utiliser delegate conn de useConnection à x.reportToDB, comment puis-je le faire?Comment utiliser le paramètre de l'utilisation Expr

merci.

@Tim Robinson, oui je ne sais pas sur conn là et c'est un problème que je veux résoudre, pourquoi vous pensez que lambda est une mauvaise idée ici?

+0

Ce code ne ressemble pas à elle compile actuellement - I ne pense pas que la première ligne devrait être indentée, et le code après votre commentaire doit être une fonction lambda –

+0

lamba est une bonne idée :). Vous n'en utilisez pas actuellement. –

Répondre

1

useConnection semble vouloir une fonction qui prend un MySqlConnection. Il fournit cette fonction avec l'objet de connexion que vous voulez.

Le correctif est:

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

Edit: Il est peut-être plus clair avec annotations de type ajouté à la fonction useConnection:

let useConnection (expr : MySqlConnection -> 'a) : 'a = 
    let Expr(conn : MySqlConnection) : 'a = 
    // etc. 
+0

Mais j'ai déjà inséré ma connexion avec expr (conn) – Cynede

+0

Vous les avez insérés dans la fonction 'useConnection', mais vous ne les récupérez pas dans' x.reportToDB'. Si vous compilez votre code, vous devriez obtenir une erreur de syntaxe dans le gros bloc en bas. –

+0

mais votre code fonctionne-t-il comme je le veux? Je veux dire que je suis encore confus à propos de ce conn amusant -> – Cynede