不只是MSSQL F#連線MySql

fairjm發表於2015-10-28

F#連線MSSQL是一件非常自然的事,微軟官方提供了很多方便的類庫,比如SqlDataConnectionSqlEntityConnection 可以實現非常方便的連線(只需要連線字串即可)和操作(Linq,F#的query expression)。

而對於MySql,這肯定不是由微軟自己來做,但是也並不麻煩,這裡介紹兩種方式。

關於連線字串

可以從這裡找MySql的: http://www.connectionstrings.com/mysql-connector-net-mysqlconnection/
MySql的Driver也帶了MySqlConnectionStringBuilder類方便構建。

使用MySql的Driver提供的工具

是ADO.NET的方式,操作比較簡單。 唯一需要裝的三方庫是Mysql.Data,使用nuget或者直接下載dll均可

PM> Install-Package MySql.Data  

加上System.DataSystem.ConfigurationSystem.Transaction引用即可正常工作。
enter image description here
(圖上忘記圈System.Configuration了)
程式碼如下:

    [<EntryPoint>]
    let main argv = 
        let cStr = @"Server=地址;Port=埠;Database=資料庫名稱;Uid=使用者名稱;Pwd=密碼;"
        use conn = new MySqlConnection(cStr)
        let command = conn.CreateCommand(CommandText = "SELECT * FROM user LIMIT 1",
                                         CommandType = CommandType.Text)
        conn.Open()
        use reader = command.ExecuteReader()
        let idOrder = reader.GetOrdinal("userid")

        if reader.Read() then
            // int 可以用string
            printfn "%s" <| reader.GetString(idOrder)
            printfn "%d" <| reader.GetInt32("userid")
            printfn "%s" <| reader.GetString("username")
            printfn "%A" <| reader.GetDateTime("created")
            // date 也可以用string
            printfn "%s" <| reader.GetString("created")
        reader.Close()
        conn.Close()
        0 // return an integer exit code  

連線字串也可以用提供的類生成:

    let str = new MySqlConnectionStringBuilder()
    str.Server <- "伺服器地址"
    str.Port <- 埠
    str.Database <- "資料庫"
    str.UserID <- "使用者名稱"
    str.Password <- "密碼"
    printfn "%s" str.ConnectionString  

只展示了查詢,其他的增刪改一樣可以操作,但用ADO.NET程式碼有點煩所以就沒有多寫,下面介紹更方便的一種方法。

使用SqlProvider

來自於開源專案 F# Data
使用起來更為簡單。
需要的依賴如圖
enter image description here
MySql的driver也是需要的
程式碼更加直接 因為使用了type provider 所以不需要自己另外建實體即可使用

    open FSharp.Data.Sql

    //使用 type provider 生成連線資料庫的型別
    type SQL = SqlDataProvider<ConnectionString = "server=;port=;database=works;user id=;password=",
                               DatabaseVendor = Common.DatabaseProviderTypes.MYSQL,
                               ResolutionPath = @"D:\datadll"> //這個位置是存放mysql driver dll的位置

    //得到上下文
    let ctx = SQL.GetDataContext() 

    let fetch name =
        //查詢直接使用上下文即可 注意 ``[works].[user]``是智慧提示的 編譯期可知
        //查詢使用query表示式
        query {
           for user in ctx.``[works].[user]`` do
                where (user.username = name)
                select user
                head
               }

    [<EntryPoint>]
    let main argv = 
        //插入使用Create()方法
        let newUser = ctx.``[works].[user]``.Create()
        newUser.username <- "cc"
        //最後Update執行
        ctx.SubmitUpdates()
        printfn "%A" argv
        0 // return an integer exit code

使用SqlProvider會更簡單一點,在做一些MySql資料庫相關的小任務時(比如根據資料生成條形圖(配合F# Charting),做一些資料的彙總CSV生成等)更為快捷。

相關文章