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

説明するのは難しいですが、useConnectionからdelegate connをx.reportToDBに使用したいのですが、どうすればいいですか?Exprの使用法からのパラメータの使い方

ありがとうございました。

@Tim Robinson、はい私はそこにconnについて知りません。それは解決したい問題です。 ラムダはここでは悪い考えですか?

+0

それは現時点ではコンパイルのようにこのコードは見ていません - I最初の行はインデントされていなければならず、コメント後のコードはラムダ関数である必要があります –

+0

lambaは素晴らしいアイディアです:)あなたは現在1つを使用していません。 –

答えて

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

+0

あなたは 'useConnection'関数にそれらを挿入しましたが、' x.reportToDB'の中でそれらを検索していません。コードをコンパイルすると、一番下の大きなブロックの中に構文エラーが発生します。 –

+0

あなたのコードは動作しますか?私はまだこの楽しいconnについて混乱しているということを意味します - > – Cynede

関連する問題