2010-12-13 25 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) 

這很難解釋,但我想使用委託conn從useConnection到x.reportToDB,我該怎麼做?如何使用Expr使用參數

謝謝。

@蒂姆羅賓遜,是的,我不知道康恩那裏,那是我想解決的問題, 爲什麼你認爲拉姆達在這裏是個壞主意?

+0

此代碼看起來並不像它編譯現在 - 我不要認爲第一行應該縮進,並且您的評論之後的代碼需要是lambda函數 – 2010-12-13 12:46:54

+0

lamba是一個好主意:)。你目前沒有使用。 – 2010-12-13 12:55:11

回答

1

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. 
+0

但是我已經在那裏插入了我與expr(conn)的連接 – Cynede 2010-12-13 12:50:48

+0

您將它們插入'useConnection'函數中,但是您沒有在'x.reportToDB'中檢索它們。如果你編譯你的代碼,你應該在底部的大塊裏面得到一個語法錯誤。 – 2010-12-13 12:54:27

+0

但你的代碼是否工作,因爲我想它的工作?我的意思是我仍然對這個有趣的conn感到困惑 - > – Cynede 2010-12-13 13:01:12