F# 优雅使用Dapper进行数据库操作

栏目: ASP.NET · 发布时间: 6年前

内容简介: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 的例子 使用就比较简单直接了~


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

让云落地

让云落地

【美】Michael J. Kavis(迈克尔 J.凯维斯) 著 / 陈志伟、辛敏 / 电子工业出版社 / 2016-3 / 65.00元

云计算落地已成事实。从前几年的概念普及,到如今越来越多的企业将业务迁移至云上,云计算正在改变整个社会的信息资源使用观念和方式。云计算还在不断成长,技术细节也在不断变化之中。对于使用者而言,能够基于自身的业务、技术和组织需求等各方面情况,选择正确的云服务模式,是成功使用云计算最关键的技术决策之一。 《让云落地:云计算服务模式(SaaS、PaaS和IaaS)设计决策》共有 16 章,作者有意避开......一起来看看 《让云落地》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具