引言

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. 001-centos7安装 笔记本 联想G510

    一.准备前提 1.联想G510AT 用winpe进入笔记本电脑,找到一个分区,删除即可 2.使用U盘安装 2.1.准备一个8G 的U盘,格式化ntfs. 2.2.在window下,下载UltraISO ...

  2. request doesn't contain a multipart/form-data or multipart/mixed stream ……

    有文件控件"file"的表单,在提交的时候,直接使用了ajax提交,结果报了一堆错,原来这个东东要提交表单,还要用post方式,最后更改为: $("#saveForm&q ...

  3. 异动K线--庄家破绽

    <异动K线--庄家破绽(连载)> http://bbs.tianya.cn/post-stocks-612892-1.shtml ————马后炮分析,没有什么前瞻性.纯技术是害死许多钻牛角 ...

  4. [转]u盘读不出来怎么办大汇总

    今天遇到的问题 http://www.upantool.com/jiaocheng/xiufu/2016/9958.html u盘读不出来怎么办大汇总 2016-12-14 21:42 来源: 本站整 ...

  5. Android下Opengl ES实现单屏幕双眼显示

    http://blog.csdn.net/u011371324/article/details/68946779 默认情况下,Opengl ES使用系统提供的帧缓冲区作为绘图表面,一般情况下,如果只在 ...

  6. nginx日志中$request_body 十六进制字符(\\x22) 引号问题处理记录

    在使用nginx记录访问日志时,发现在含有 request_body 的 PUT , POST 请求时,日志中会含有 x22 x9B x5C x09 x08 字符,不利于阅读和处理. 具体 支持 re ...

  7. 一个声明被new多次

    如果声明一个指针变量,然后为这个变量new多次, eg:Type* A: A = new Type();//1 A = new Type();//2 最后变量A指向的是最后的那个对象,与前面new的无 ...

  8. URI Is Not Registered

    使用IntelliJ Maven生成archetype时候,偶然会出现xml文件的头定义提示错误 URI is not registered 例如: 解决方法: 鼠标点击红色字,然后Intellij出 ...

  9. java.net.UnknownHostException异常处理

    1.问题描述 最近迁移环境,在Linux系统下部署Java产品的应用,后台报出如下异常,系统报找不到名为“xxx-houtai1”的主机: 1 java.net.UnknownHostExceptio ...

  10. 【P2476】着色方案(记忆化搜索+特殊的DP数组)

    这个题代码难度几乎为0,然而思维难度对于蒟蒻来说简直是突破天际啊!首先我思考的是这个油漆的种类只有15种,是不是可以像一道叫做8数码难题的东西暴力15维数组呢..计算发现不可以....空间会直接让你学 ...