Dapper介绍

Dapper是轻量级的.net ORM框架,配合linq和泛型,让C#操作数据的代码简洁、高效又灵活!最近的工作项目中使用了Dapper,在这里分享一些实用技巧。阅读之前需要了解一些基本的使用方法,参见官网http://dapper-tutorial.net/ 。

Dapper撤销查询

你的应用程序应该给用户提供各种“取消”的功能,这就在包括了查询数据的时候撤销一条正在执行的查询,Dapper像很多ORM一样提供了这个操作,看看这段代码:// using Dapper;

var products = sqlConnection.QueryAsync<Product>(new CommandDefinition(
queryProducts,
new { Type = "SomeType" },
commandTimeout: 60,
cancellationToken: myToken)).Result.ToList();

这里Product是定义好的数据类,queryProducts是查询文本,myToken是定义好的Task的CancellationToken。这段代码使用QueryAsync异步方法实现了可撤销的查询操作,开发者需要把控制撤销的myToken传给CommandDefinition的可选参数cancellationToken。使用代码之前,要了解一下C#的Task概念。

另外值得注意的是,查询的TimeOut可以通过commandTimeout设置(默认30s)。

Dapper使用事务

事务是数据库的重要概念,Dapper对事务提供了很好的支持,看看这段代码:

1 // using System.Linq;
2 // using System.Data.SqlClient;
3 using (SqlTransaction tran = sqlConn.BeginTransaction())
4 {
5     var pars = ProductsWithNewPrice.Select(t => { return new { t.ProductID, t.Price }; });
6     sqlConn.Execute(UpdateProductPrice, pars, transaction: tran);
7     tran.Commit();
8 }

通过喜闻乐见的using形式执行一段事务,这里假设ProductsWithNewPrice是一个具有新价格的Product类的集合,事务的目的是把这些新价格通过Update语句更新到数据库中。第5行用linq取出了具有ProductID和Price字段的临时类型的集合,这个集合作为下面一行所执行的sql语句们的参数。UpdateProductPrice是查询文本,应该是类似这样的“UPDATE dbo.Product set Price = @Price WHERE ProductID = @ProductID;”。因为使用了transaction,pars集合中的所有参数对应的"UPDATE"语句会在同一个事务中完成。

从数据库取UTC时间

我们假设工作环境中数据库一直使用UTC时间(现实经常是这样),我们写的代码经常从数据库中读取时间并转化成C#的DateTime结构。转化的时候Datretime.Kind属性经常被忽略,这可能导致随后的使用中把时间值当做本地时间。要确保避免这样的错误,我们可以做一个设定,把Dapper取到的值指定DateTimeKind为UTC,并把正确的UTC时间存储到数据库。代码是这样的,先创建DateTimeHandler类:

    public class DateTimeHandler : SqlMapper.TypeHandler<DateTime>{public override void SetValue(IDbDataParameter parameter, DateTime value){parameter.Value = DateTime.SpecifyKind(value, DateTimeKind.Utc);}public override DateTime Parse(object value){return DateTime.SpecifyKind(Convert.ToDateTime(value), DateTimeKind.Utc);}}

然后在你的类的构造函数中加入这行:

            SqlMapper.AddTypeHandler(new DateTimeHandler());

这样,Dapper取到的时间值和通过Dapper保存到数据库的时间值就都是UTC时间了。

使用字符串变量名拼接多个SQL语句

请看下面这段代码。这里使用加号“+”拼接了两个不同功能的SQL语句,并且让两个语句都可以复用!我认为这在指定情景中是一个很好的实践。

    var nextWorkID = sqlConn.Query<int>(SubmitCurrentWork + FindNextWorkID, new { currentWorkID, currentWorkResult }).FirstOrDefault();

不过这样使用Dapper有两个要求:

  1. 每个SQL字符串变量都要以分号结尾。
  2. 不同SQL语句中的变量名必须是一样的。

满足了这两个要求才能写上面那样的代码。上面代码中的SQL字符串变量可以是下面这样:

    string SubmitCurrentWork = "UPDATE dbo.Works SET WorkResult = @currentWorkResult, Status = 'Done' WHERE ID = @currentWorkID;";string FindNextWorkID = "SELECT TOP 1 ID FROM dbo.Works WHERE Status != 'Done';"; // 如果这里有名为@currentWorkResult或@currentWorkID的变量,其用途/含义要和上面的语句一致

Dapper使用技巧相关推荐

  1. .NET Core中使用Dapper操作Oracle存储过程最佳实践

    为什么说是最佳实践呢?因为在实际开发中踩坑了,而且发现网上大多数文章给出的解决方法都不能很好地解决问题.尤其是在获取类型为OracleDbType.RefCursor,输出为:ParameterDir ...

  2. Dapper的动态查询生成器

    目录 介绍 背景 动态SQL 你好Bobby 表 参数化SQL 回到现代软件 Dapper 例子 不要重复自己 字符串插值内部 DapperQueryBuilder 快速开始 筛选器清单 Fluent ...

  3. ABP vNext 的实体与服务扩展技巧分享

    使用 ABP vNext 有一个月左右啦,这中间最大的一个收获是:ABP vNext 的开发效率真的是非常好,只要你愿意取遵循它模块化.DDD 的设计思想.因为官方默认实现了身份.审计.权限.定时任务 ...

  4. keyshot怎么批量渲染_提高Keyshot逼真渲染的小技巧

    Keyshot是一个特别神奇的应用软件,但是,就像Photoshop一样,如果你不知道怎么使用它,那么再优秀的工具在你手中也什么都是了.这里我就告诉你一些制作优秀效果图的技巧以及如何使用这个神奇软件. ...

  5. Linux shell 学习笔记(6)— vim 编辑器使用方法及技巧

    1. 检查 vim 软件包 1.1 CentOS 发行版 $ alias vi alias vi='vim' $ $ which vim /usr/bin/vim $ $ ls -l /usr/bin ...

  6. Python 笔试面试及常用技巧 (1)

    1. 交换两个数字 In [66]: x, y = 1, 2In [67]: x Out[67]: 1In [68]: y Out[68]: 2 赋值的右侧形成了一个新的元组,左侧立即解析(unpac ...

  7. Redis 使用技巧

    Redis 现在非常受欢迎,似乎已经成为内存数据存储行业的标准.本人结合平时使用Redis经验,也同时查找了一些网上别人的总结经验,总结以下几条Redis使用技巧. 1. 停止使用 KEYS 众所周知 ...

  8. 受用一生的高效 PyCharm 使用技巧(六)

    http://www.sohu.com/a/329854019_654419 大家好,今天我又来给大家更新 PyCharm 的使用技巧. 从第一篇开始,一直到本篇,一共更新了6篇文章,每篇 5 个小技 ...

  9. 受用一生的高效 PyCharm 使用技巧(四)

    https://blog.csdn.net/pdcfighting/article/details/93269028 大家好,距离最近一篇 PyCharm 使用技巧的文章已经过去一月有余,最近虽然也比 ...

最新文章

  1. mac 查看端口_如何重置mac上的系统管理控制器smc教程
  2. python下载word文件-python-docx操作word文件(*.docx)
  3. linux less命令简介
  4. 华为手机充满有提醒吗_华为推出的联发科天玑手机华为nova8 SE,你会买吗?
  5. How to debug Material delta download
  6. JAVA链表中迭代器的实现
  7. php 查询逗号分隔字符串,PHP-在逗号分隔的字符串mysql中查找值
  8. 基于51单片机+DS18B20温度测温器+LCD1602显示
  9. 服务器被ddos攻击?分析如何防止DDOS攻击?
  10. 大学计算机基础实验指导word,大学计算机基础实验指导全套.doc
  11. 软件测试工程师项目业绩怎么写,软件工程师的“项目业绩”如何才能脱颖而出?...
  12. 基于Python实现图片格式转换的小程序
  13. 解决win10升级到win11,打不开安全中心的问题(亲测有效,已修复)
  14. Java小项目-银行用户管理系统
  15. C# 打开excel
  16. 混合开发Hybrid App为何成为热门?
  17. java字符串相加_String字符串相加的原理
  18. Solidworks安装SW2URDF插件安装后无法正常加载问题
  19. MySQL三种统计行数的方式比较
  20. 【小程序源码】简单舒服新UI趣图制作神器

热门文章

  1. 一文归纳总结分布式架构的那些事!
  2. Nginx + 阿里云SSL + tomcat 实现https访问代理
  3. 转 已知两点坐标和半径求圆心坐标程序C++
  4. 移动端触摸移动小demo
  5. linux常用命令总结
  6. eclipse中js文件报missing semicolon
  7. 知方可补不足~CSS中的几个伪元素
  8. CSS BOX类型和display属性
  9. webServer tomcat5/tomcat6/tomcat7诠释
  10. petshop 4.0的数据持久层