【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 最近两个版本才加上的一个特殊属性.通过这个属性,我 ...
随机推荐
- ./bin/console server:run Surprise! There are no commands defined in the "server" namespace.
Let's start the built-in web server: ./bin/console server:run Surprise! There are no commands defi ...
- JavaScript+css+ div HTML遮罩層效果
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Test</title ...
- LeetCode-day04
35. Same Tree 判断两棵树相同 36. Invert Binary Tree 翻转树 37. Symmetric Tree 判断树是不是镜像对称的 38. Maximum Depth of ...
- MVC4 中使用 Area 和 注意的地方
在MVC项目中经常会使用到Area来分开不同的模块让项目结构更加的清晰. 步骤如下: 项目 –> 添加 -> 区域 (Area) 输入 Admin 添加成功后 Area包含:创建一个空 ...
- LeetCode:最长公共前缀【14】
LeetCode:最长公共前缀[14] 题目描述 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flo ...
- 谷歌机器学习速成课程---3降低损失 (Reducing Loss):学习速率
正如之前所述,梯度矢量具有方向和大小.梯度下降法算法用梯度乘以一个称为学习速率(有时也称为步长)的标量,以确定下一个点的位置.例如,如果梯度大小为 2.5,学习速率为 0.01,则梯度下降法算法会选择 ...
- list列表、tuple元组、range常用方法总结
list 列表(数组),是可迭代对象,列表是可变的所以列表的方法都是在列表本身更改的.里面看可以放各种数据类型的数据,可存储大量数据 连接列表可以使用 + 或 extend() a = [1, 3, ...
- python 课堂笔记-for语句
for i in range(10): print("----------",i) for j in range(10): print("world",j) i ...
- HttpServlet---getLastModified与缓存
在HttpServlet中重写service方法的代码如下: protected void service(HttpServletRequest req, HttpServletResponse re ...
- finally中的return
周五晚6点下班去面试,出了一份笔试题,看到第一题有些蒙了,虽然以前遇到过类似的问题,但并没有留心记一下,觉得没人会这样写代码,但实际上没有面试题中是有的. 1,有在try块中执行不到finally的情 ...