【ORM】关于Dapper的一些常见用法
引言
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的一些常见用法的更多相关文章
- .NET轻量级ORM框架Dapper入门精通
一.课程介绍 本次分享课程包含两个部分<.NET轻量级ORM框架Dapper修炼手册>和<.NET轻量级ORM框架Dapper葵花宝典>,阿笨将带领大家一起领略轻量级ORM框架 ...
- .NET轻量级ORM组件Dapper修炼手册
一.摘要 1.1.为什么叫本次的分享课叫<修炼手册>? 阿笨希望本次的分享课中涉及覆盖的一些小技巧.小技能给您带来一些帮助.希望您在日后工作中把它作为一本实际技能手册进行储备,以备不时之需 ...
- Linux中find常见用法
Linux中find常见用法示例 ·find path -option [ -print ] [ -exec -ok command ] {} \; find命令的参数 ...
- php中的curl使用入门教程和常见用法实例
摘要: [目录] php中的curl使用入门教程和常见用法实例 一.curl的优势 二.curl的简单使用步骤 三.错误处理 四.获取curl请求的具体信息 五.使用curl发送post请求 六.文件 ...
- Guava中Predicate的常见用法
Guava中Predicate的常见用法 1. Predicate基本用法 guava提供了许多利用Functions和Predicates来操作Collections的工具,一般在 Iterabl ...
- find常见用法
Linux中find常见用法示例 ·find path -option [ -print ] [ -exec -ok command ] {} \; find命令的参数 ...
- iOS 开发多线程篇—GCD的常见用法
iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...
- iOS开发多线程篇—GCD的常见用法
iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...
- [转]EasyUI——常见用法总结
原文链接: EasyUI——常见用法总结 1. 使用 data-options 来初始化属性. data-options是jQuery Easyui 最近两个版本才加上的一个特殊属性.通过这个属性,我 ...
随机推荐
- 001-centos7安装 笔记本 联想G510
一.准备前提 1.联想G510AT 用winpe进入笔记本电脑,找到一个分区,删除即可 2.使用U盘安装 2.1.准备一个8G 的U盘,格式化ntfs. 2.2.在window下,下载UltraISO ...
- request doesn't contain a multipart/form-data or multipart/mixed stream ……
有文件控件"file"的表单,在提交的时候,直接使用了ajax提交,结果报了一堆错,原来这个东东要提交表单,还要用post方式,最后更改为: $("#saveForm&q ...
- 异动K线--庄家破绽
<异动K线--庄家破绽(连载)> http://bbs.tianya.cn/post-stocks-612892-1.shtml ————马后炮分析,没有什么前瞻性.纯技术是害死许多钻牛角 ...
- [转]u盘读不出来怎么办大汇总
今天遇到的问题 http://www.upantool.com/jiaocheng/xiufu/2016/9958.html u盘读不出来怎么办大汇总 2016-12-14 21:42 来源: 本站整 ...
- Android下Opengl ES实现单屏幕双眼显示
http://blog.csdn.net/u011371324/article/details/68946779 默认情况下,Opengl ES使用系统提供的帧缓冲区作为绘图表面,一般情况下,如果只在 ...
- nginx日志中$request_body 十六进制字符(\\x22) 引号问题处理记录
在使用nginx记录访问日志时,发现在含有 request_body 的 PUT , POST 请求时,日志中会含有 x22 x9B x5C x09 x08 字符,不利于阅读和处理. 具体 支持 re ...
- 一个声明被new多次
如果声明一个指针变量,然后为这个变量new多次, eg:Type* A: A = new Type();//1 A = new Type();//2 最后变量A指向的是最后的那个对象,与前面new的无 ...
- URI Is Not Registered
使用IntelliJ Maven生成archetype时候,偶然会出现xml文件的头定义提示错误 URI is not registered 例如: 解决方法: 鼠标点击红色字,然后Intellij出 ...
- java.net.UnknownHostException异常处理
1.问题描述 最近迁移环境,在Linux系统下部署Java产品的应用,后台报出如下异常,系统报找不到名为“xxx-houtai1”的主机: 1 java.net.UnknownHostExceptio ...
- 【P2476】着色方案(记忆化搜索+特殊的DP数组)
这个题代码难度几乎为0,然而思维难度对于蒟蒻来说简直是突破天际啊!首先我思考的是这个油漆的种类只有15种,是不是可以像一道叫做8数码难题的东西暴力15维数组呢..计算发现不可以....空间会直接让你学 ...