内容简介:F# 优雅使用Dapper进行数据库操作
本文来自图灵社区@fairjm 转截请注明出处
之前写过一篇用 SQLProvider
进行数据库连接的,但实际使用的时候发现兼容性不是很好,在用 mysql 的时候很多表都找不到,要反复rebuild.
直接使用 ADO.NET
的话就显得麻烦.
来看一下 ADO.NET
一个查询到例子
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()
如果要用参数化的话还需要以下代码来设置 SqlCommand
//创建SqlCommand对象 SqlCommand cmd = conn.CreateCommand(); //默认就是text cmd.CommandType = CommandType.Text; //sql语句 cmd.CommandText = "select * from products = @ID"; cmd.Parameters.Add("@ID", SqlDbType.Int); //给参数 sql 语句的参数赋值 cmd.Parameters["@ID"].Value = 1;
作为常常写脚本的工具,我对数据库查询的需求是使用简单方便,因为是写脚本,所以不会涉及到很多表的 JOIN
,一对多,多对多的处理等等,能方便读取行数据就可以了.
这一点Dapper可以很好满足.Dapper可以使用 dynamic object
作为查询参数和返回结果.
但FSharp似乎没有直接使用 dynamic object
的方式(有的话欢迎打脸...没找着),这里可以借用第三方的项目来.比如 FSharp.Interop.Dynamic
.
使用之后构建查询就方便多了:
let query = ExpandoObject() query?userId <- 147090
也可以直接解析返回结果
需要的扩展:
Install-Package FSharp.Interop.Dynamic Install-Package MySql.Data -Version 6.9.9 Install-Package Dapper
代码:
open MySql.Data.MySqlClient open FSharp.Interop.Dynamic open Dapper open System open System.Dynamic let getConnection (addr, user, pass, db, port) = let builder = new MySqlConnectionStringBuilder() builder.Server <- addr builder.UserID <- user builder.Password <- pass builder.Database <- db builder.Port <- port let conn = new MySqlConnection(builder.ConnectionString) conn.Open() conn let conn = getConnection("","","","",3306) let query = ExpandoObject() query?userId <- 1 let obj = conn.QueryFirst("select * from user where userid = @userId", query) let objs = conn.Query("select * from user limit 10") printfn "%A" obj?username objs |> Seq.iter (fun e -> printfn "%s" e?username) conn.Close()
对比上面 ADO.NET
的例子 使用就比较简单直接了~
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 在Golang中对MySQL进行操作
- SpringBoot中利用MyBatis进行数据操作
- 使用Log4J进行日志操作
- []==''返回?为什么?运算符==进行了什么操作?
- 移动端上传图片进行平移放大缩小操作后生成海报
- Linux 下使用 LVM 快速合并磁盘进行扩容操作
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Agile Web Development with Rails, Third Edition
Sam Ruby、Dave Thomas、David Heinemeier Hansson / Pragmatic Bookshelf / 2009-03-17 / USD 43.95
Rails just keeps on changing. Rails 2, released in 2008, brings hundreds of improvements, including new support for RESTful applications, new generator options, and so on. And, as importantly, we’ve a......一起来看看 《Agile Web Development with Rails, Third Edition》 这本书的介绍吧!