Dapper使用技巧分享
Dapper是轻量级的.net ORM框架,配合linq和泛型,让C#操作数据的代码简洁、高效又灵活!最近的工作项目中使用了Dapper,在这里分享一些实用技巧。阅读之前需要了解一些基本的使用方法,参见官网http://dapper-tutorial.net/ 。
- 写可撤销的查询:
你的应用程序应该给用户提供各种“取消”的功能,这就在包括了查询数据的时候撤销一条正在执行的查询,Dapper像很多ORM一样提供了这个操作,看看这段代码:
// using Dapper; var products = sqlConnection.QueryAsync<Product>(new CommandDefinition(
queryProducts,
new { Type = "SomeType" },
commandTimeout: ,
cancellationToken: myToken)).Result.ToList();
这里Product是定义好的数据类,queryProducts是查询文本,myToken是定义好的Task的CancellationToken。这段代码使用QueryAsync异步方法实现了可撤销的查询操作,开发者需要把控制撤销的myToken传给CommandDefinition的可选参数cancellationToken。使用代码之前,要了解一下C#的Task概念。
另外值得注意的是,查询的TimeOut可以通过commandTimeout设置(默认30s)。
- 使用事务:
事务是数据库的重要概念,Dapper对事务提供了很好的支持,看看这段代码:
// using System.Linq;
// using System.Data.SqlClient;
using (SqlTransaction tran = sqlConn.BeginTransaction())
{
var pars = ProductsWithNewPrice.Select(t => { return new { t.ProductID, t.Price }; });
sqlConn.Execute(UpdateProductPrice, pars, transaction: tran);
tran.Commit();
}
通过喜闻乐见的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有两个要求:
- 每个SQL字符串变量都要以分号结尾。
- 不同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使用技巧分享的更多相关文章
- SharePoint 2013技巧分享系列 - 同步Exchange显示高清用户照片
在“SharePoint 2013技巧分享系列 - Active Directory同步显示用户照片”文中介绍了如何同步Active Directory显示用户照片,但是同步完成后,用户照片尺寸和清晰 ...
- 技巧分享:解决Word 2010当中“分页符”造成的空白行
技巧分享:解决Word 2010当中“分页符”造成的空白行 P1:关于“分页符” 在Word当中插入“分页符”之后,后面的内容就会“更起一段”.就好像“换行符”(回车)会让后面的内容“另起一行”一样. ...
- 批量删除wps文档里的回车符的方法!WPS使用技巧分享!
有时候整理文档的时候,如果是从网上复制的文字,可能会因为复制而产生很多的回车符.怎样能批量去掉这些个回车符呢,下面马上告诉你批量删除wps文档里的回车符的方法!WPS使用技巧分享! 想要批量删除批量删 ...
- webstorm的中文教程和技巧分享
webstorm是一款前端javascript开发编辑的神器,此文介绍webstorm的中文教程和技巧分享.webstorm8.0.3中文汉化版下载:百度网盘下载:http://pan.baidu.c ...
- WebBrowser控件使用技巧分享
原文:WebBrowser控件使用技巧分享 在发布“淘宝登货员”时发现不少朋友对WebBrowser控件比较感兴趣,故在此分享一下使用心得. 首先分享一个WebBrowser的扩展类(此类所需的dll ...
- Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南)
作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9941208.html 主讲人:大石头 时间:2018-11-10 晚上20:00 地点:钉钉群(组织代码 ...
- 编辑技巧分享如何给PDF添加注释
纸质的文件想要添加注释就直接拿笔在上面添加就好了,那么电子文件要怎么添加注释呢,今天小编就以我们现在经常使用到的PDF文档来为大家分享怎么添加注释. 1. 我们需要在百度中搜索并下载并安装一款PD ...
- Android技巧分享——如何用电脑下载在Google play中应用的apk文件
[Android技巧分享系列] 1.Android技巧分享——让官方模拟器和genymotion虚拟机飞起来 2.Android技巧分享——如何用电脑下载在Google play中应用的apk文件 G ...
- 【转载】webstorm-前端javascript开发神器中文教程和技巧分享
webstorm是一款前端javascript开发编辑的神器,此文介绍webstorm的中文教程和技巧分享. webstorm8.0.3中文汉化版下载:百度网盘下载:http://pan.baidu. ...
随机推荐
- js中Array数组基本方法
总结:push() 添加元素到数组未尾, 返回数组长度 unshift() 添加元素到数组头部, 返回数组长度 pop() 删除数组未尾元素, 返回删除元素 shift() 删除数组头部元素, 返回删 ...
- centos 7安装myslq
# wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm # rpm -ivh mysql-community- ...
- 华为S5700配置端口镜像和华三S5120配置802.1X认证记录
一.说明 事情的起因是我们部门有个华为的S5700交换机,想配置端口镜像抓包但让助理买的串口线很久都还没到:而昨天测试部的同事说他们那有台华三的S5120想要配802.1X认证,但只有华为交换机的文档 ...
- 像调试java一样来调试Redis lua
高并发的系统中,redis的使用是非常频繁的,而lua脚本则更是锦上添花.因为lua脚本本身执行的时候是一个事务性的操作,不会掺杂其他外部的命令,所以很多关键的系统节点都会用redis+lua来实现一 ...
- Lapack求解线性方程组
可参见这两个页面: 1. http://www.culatools.com/dense/lapack/ 2. http://www.netlib.org/lapack/lug/node1.html 根 ...
- [Err] 1093 - You can't specify target table 'master_data' for update in FROM clause
delete from master_data where category_id not in (select category_id from master_data a, bc_category ...
- JavaScript热身练习1
把某个元素移出你的视线: 1.display:none:(显示为无,不占地) 2.visibility:hidden:(隐藏,占地) 3.宽或者高设置为零 4.透明度设置 5.left/top (定位 ...
- 怎样用div做三角形
20181204 用盒子模型做三角形的效果: <div></div> width:0px; height:0px; border:10px solid red; border- ...
- CAT部署安装文档
多数软件都在/root/project/codebase/3rdpart redhat7用firewalld取代了iptables,遇到问题请添加redhat7关键字搜索,详情请参见Common ad ...
- Linux VPS自动定时备份网站文件和MYSQL数据库到FTP空间(LNMP)
如果我们网站更新不是很频繁,我们可以定期手动进行备份网站文件和MYSQL数据库导出.如果我们网站数据更新频繁,且数据尤为重要,建议要采用定期自动 备份,至少需要多备份数据,无论我们选择何种优秀的VPS ...