引言

Dapper是.Net平台下一款小巧玲珑的开源Orm框架,简单实用的同时保持高性能,非常适合我这种喜欢手写SQL的人使用,下面介绍一下如何使用Dapper.

相关资料

Dapper的GitHub地址是dapper-dot-net,上面有一些用法和性能的介绍,有兴趣者可以上去看看.

数据库设计和实体类

    简单设计两个表,分别为部门表,雇员表.

CREATE TABLE [dbo].[T_Dept] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Dept] NCHAR (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[DeptNo] NCHAR (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
); CREATE TABLE [dbo].[T_Employee] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[DeptNo] NCHAR (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[EmployeeName] NCHAR (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);

实体类如下

   class Depts
{
public int Id { get; set; }
public string Dept { get; set; }
public string DeptNo { get; set; } public List<Employees> EmployeeList { get; set; }
} class Employees
{
public int Id { get; set; }
public string DeptNo { get; set; }
public string EmployeeName { get; set; }
}

连接静态类

  public static class SqlServerConnect
{
public static SqlConnection SqlConnection()
{
string sqlconnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
var connection = new SqlConnection(sqlconnectionString);
connection.Open();
return connection;
} }

Insert

Insert有几种写法,分别直接绑定参数,数组,或者集合,Execute的返回值是指受影响的行数.

using (SqlConnection con = SqlServerConnect.SqlConnection())
              {

                //直接绑定参数
con.Execute("insert into T_Dept(Dept,DeptNo) values (@dept,@deptno) ", new { Dept = "销售部", Deptno = "" });
//匿名数组
con.Execute("insert into T_Employee(EmployeeName,DeptNo) values (@EmployeeName,@DeptNo) ",
new[] { new { EmployeeName = "李四", DeptNo = "" }, new { EmployeeName = "张三", DeptNo = "" } });
//集合
List<Employees> employees = new List<Employees>();
employees.Add(new Employees { DeptNo = "", EmployeeName = "老王" });
employees.Add(new Employees { DeptNo = "", EmployeeName = "老李" });
con.Execute("insert into T_Employee(EmployeeName,DeptNo) values (@employeeName,@deptNo) ", employees);
}

 Update和Delete

Update和Delete没什么好说的了,用法一样,举例匿名数组的用法

    using (SqlConnection con = SqlServerConnect.SqlConnection())
{
con.Execute("update T_Dept set Dept=@name where DeptNo=@deptno ",new[] { new { name = "人事部二", deptno = "" },new { name = "销售部二", deptno = "" } }); con.Execute("delete from T_Employee where EmployeeName=@name ", new[] { new { name = "小王" }, new { name = "张三" } });
}

Select

Select操作主要是利用Query方法,也可以利用ExecuteScalar做一些获取数据库时间之类的操作,如下

         using (SqlConnection con = SqlServerConnect.SqlConnection())
{
IEnumerable<Depts> deptList = con.Query<Depts>("select id, Dept,DeptNo from T_Dept"); DateTime dateTime= con.ExecuteScalar<DateTime>("select getdate()"); Console.WriteLine(dateTime);
}

存储过程

主要演示一下输入输出参数的过程和返回多游标的过程.

过程如下

CREATE PROCEDURE [dbo].P_Emploee_Ins
@In_DeptNo NVARCHAR(20) ,
@In_EmployeeName NVARCHAR(20),
@Out_Message NVARCHAR(20) output
AS insert into T_Employee( DeptNo, EmployeeName) values (@In_DeptNo,@In_EmployeeName);
set @Out_Message='完成'; CREATE PROCEDURE [dbo].P_DeptEmploee_Sel
@In_DeptNo NVARCHAR(20) , @Out_Message NVARCHAR(20) output
AS
SELECT * from T_Dept t where t.DeptNo=@In_DeptNo;
SELECT * from T_Employee t where t.DeptNo=@In_DeptNo;

调用如下

       using (SqlConnection con = SqlServerConnect.SqlConnection())
{
DynamicParameters p = new DynamicParameters();
p.Add("@In_DeptNo", "");
p.Add("@In_EmployeeName", "小李");
p.Add("@Out_Message", "", DbType.AnsiString, ParameterDirection.Output);
con.Execute("dbo.P_Emploee_Ins", p, commandType: CommandType.StoredProcedure);
string message = p.Get<string>("@Out_Message");
}
      using (SqlConnection con = SqlServerConnect.SqlConnection())
{
DynamicParameters p2 = new DynamicParameters();
p2.Add("@In_DeptNo", "");
p2.Add("@Out_Message", "", DbType.AnsiString, ParameterDirection.Output); SqlMapper.GridReader gridReader = con.QueryMultiple("dbo.P_DeptEmploee_Sel", p2, commandType: CommandType.StoredProcedure); IEnumerable<Depts> dept = gridReader.Read<Depts>();
IEnumerable<Employees> employee = gridReader.Read<Employees>(); string message2 = p.Get<string>("@Out_Message");
}

事务操作

      using (SqlConnection con = SqlServerConnect.SqlConnection())
{
IDbTransaction transaction = con.BeginTransaction();
con.Execute("insert into T_Employee(EmployeeName,DeptNo) values (@EmployeeName,@DeptNo) ",
new { EmployeeName = "老王", DeptNo = "" }, transaction: transaction);
con.Execute("insert into T_Employee(EmployeeName,DeptNo) values (@EmployeeName,@DeptNo) ",
new { EmployeeName = "老李", DeptNo = "" }, transaction: transaction);
transaction.Commit();
}

小结

本文介绍了Dapper的一些常见用法,而.Net4.5版的还有上述方法的异步实现的,这里就不一一示范了.话说以前都是连Oracle数据的,换成Sql Server用法几乎没有变化,感觉真好.如果你有更好的建议,请不吝留言指教.

【ORM】关于Dapper的一些常见用法的更多相关文章

  1. .NET轻量级ORM框架Dapper入门精通

    一.课程介绍 本次分享课程包含两个部分<.NET轻量级ORM框架Dapper修炼手册>和<.NET轻量级ORM框架Dapper葵花宝典>,阿笨将带领大家一起领略轻量级ORM框架 ...

  2. .NET轻量级ORM组件Dapper修炼手册

    一.摘要 1.1.为什么叫本次的分享课叫<修炼手册>? 阿笨希望本次的分享课中涉及覆盖的一些小技巧.小技能给您带来一些帮助.希望您在日后工作中把它作为一本实际技能手册进行储备,以备不时之需 ...

  3. Linux中find常见用法

    Linux中find常见用法示例 ·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \; find命令的参数 ...

  4. php中的curl使用入门教程和常见用法实例

    摘要: [目录] php中的curl使用入门教程和常见用法实例 一.curl的优势 二.curl的简单使用步骤 三.错误处理 四.获取curl请求的具体信息 五.使用curl发送post请求 六.文件 ...

  5. Guava中Predicate的常见用法

    Guava中Predicate的常见用法 1.  Predicate基本用法 guava提供了许多利用Functions和Predicates来操作Collections的工具,一般在 Iterabl ...

  6. find常见用法

    Linux中find常见用法示例 ·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \; find命令的参数 ...

  7. iOS 开发多线程篇—GCD的常见用法

    iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...

  8. iOS开发多线程篇—GCD的常见用法

    iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...

  9. [转]EasyUI——常见用法总结

    原文链接: EasyUI——常见用法总结 1. 使用 data-options 来初始化属性. data-options是jQuery Easyui 最近两个版本才加上的一个特殊属性.通过这个属性,我 ...

随机推荐

  1. hadoop学习第三天-MapReduce介绍&&WordCount示例&&倒排索引示例

    一.MapReduce介绍 (最好以下面的两个示例来理解原理) 1. MapReduce的基本思想 Map-reduce的思想就是“分而治之” Map Mapper负责“分”,即把复杂的任务分解为若干 ...

  2. 剑指offer 面试43题

    面试43题: 题目:1~n整数中1出现的次数 题:输入一个整数n,求1~n这n个整数的十进制表示中1出现的次数.例如,输入12,1~12这些整数中包含1的数字有1,10,11,12一共出现了5次. 解 ...

  3. LeetCode:分割链表【86】

    LeetCode:分割链表[86] 题目描述 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前. 你应当保留两个分区中每个节点的初始相对位置. 示例 ...

  4. HackerRank - lonely-integer 【水】

    题意 给出一系列数字,输出那个出现次数为奇数次的数字 思路 用MAP标记一下,在输入的时候判断一下 之前有没有输入过,如果有,就抹掉 最后剩下的那个 就是出现次数为奇数的 或者可以用 位运算 AC代码 ...

  5. swift的值类型和引用类型

    前言 最近在学设计模式中,发现 Swift 中的 struct,class 以及 enum 在一般的使用中能够做到互相替换,因此探究其背后的逻辑就十分有必要.而这一问题又引出了 Swift 中的值类型 ...

  6. http://www.uupoop.com/ps/

    网页版PS,在线PS 基本的PS功能都有,最重要的一点是快,网页版的嘛,哼哼!

  7. 大话设计模式之PHP篇 - 单例模式

    在编写PHP代码的时候,经常使用new关键字实例化一个对象,比如 <?php Class Database { } $db = new Database; 这是最常规的实例化操作方法,像数据库操 ...

  8. PreTranslateMessage作用和使用方法

    PreTranslateMessage作用和使用方法  PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗口的消息都要通过这里,比较常用, ...

  9. 关于读取本地text文件,自动被添加空格的问题

    最近做一个小程序,读取本地指定路径下的text文件,逐行获取text文本然后再进行处理,结果遇到了一个奇葩问题,先插个图片给各位看官 坑:本地text文件中数据为1123/10(数据反复检查无空格,换 ...

  10. Struts2获取参数的几种方式

    Struts2由于是一个贴心的框架,所以获取参数这种体力活,就无需再通过原生的request来getParameter了,有如下几种方式进行获取 1.Action中属性驱动,必须提供与form表单na ...