如何在 Dapper.NET 中使用事务?

咨询区

  • Amit

我的项目中使用 dapper.net 做数据库连接框架,有一个需求需要在多个表上执行多次插入操作,我想把它 事务化,但我看 dapper 并没有提供类似的方式。

请问我该如何使用 dapper 来做这项工作呢?

回答区

  • Newteq Developer

如果用 Dapper 实现事务功能,大概有三种实现方式。

  1. 简单的事务方法

这种事务方式很原始,就是在已存在的 Connection 上创建 Transaction, 然后将事务作为参数传递到 Execute 方法中,当业务逻辑处理完后,再做 commit 提交,参考如下代码:

string sql = "INSERT INTO Customers (CustomerName) Values (@CustomerName);";using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{connection.Open();using (var transaction = connection.BeginTransaction()){connection.Execute(sql, new {CustomerName = "Mark"}, transaction: transaction);connection.Execute(sql, new {CustomerName = "Sam"}, transaction: transaction);connection.Execute(sql, new {CustomerName = "John"}, transaction: transaction);transaction.Commit();}
}
  1. 使用 TransactionScope

如果你喜欢用 TransactionScope 方式,有一点要注意,那就是需要在 connection 创建之前创建 Scope,然后在 Scope 作用域内做你想做的sql操作,最后执行一个 complete 提交即可,参考如下代码:

using (var transaction = new TransactionScope())
{var sql = "INSERT INTO Customers (CustomerName) Values (@CustomerName);";using (var connection = My.ConnectionFactory()){connection.Open();connection.Execute(sql, new {CustomerName = "Mark"});connection.Execute(sql, new {CustomerName = "Sam"});connection.Execute(sql, new {CustomerName = "John"});}transaction.Complete();
}
  1. 使用 Dapper Transaction 方式

这是使用 Dapper 最推荐的方式,毕竟它的代码语义太强了,你可以直接在 new 出的 Transaction 之上执行各自的sql语句,参考如下代码:

string sql = "INSERT INTO Customers (CustomerName) Values (@CustomerName);";using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{connection.Open();using (var transaction = connection.BeginTransaction()){transaction.Execute(sql, new {CustomerName = "Mark"});transaction.Execute(sql, new {CustomerName = "Sam"});transaction.Execute(sql, new {CustomerName = "John"});transaction.Commit();}
}

点评区

说实话,这三种方式总结的特别好,但有一点看着很不爽,那就是在执行 Transaction 之前需要 connection.Open(),有点繁琐,所以这一块还是可以再封装一下的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296131.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件给制实施规定的实例(GB8567-88)

尽管在文件编制中存在着很多灵活性,然而,文件的编制确实是非常必要的,其意义如前所述。为了控制这种灵活性,保证文件编制能达到应该达到的目的,对于具体的软件开发任务,应编制的文件的种类、详细程度应取决…

python 内存数据库下载,Python 文件存储和数据库

Python 中数据存储的方式和其他语言没什么区别,主要分为两个方面:文件存储和数据库存储。文件存储文件存储的方法也分为很多种,主要包括:Python 内置方法NumPy 模块方法os 模块方法csv 模块方法Python 内置方法在不需要借助任何外…

c#10中的namespace

A、namespace是c#用来管理类型隔离的关键字,在不同的namespace下可以相同名称的类型,并且namespace是可以嵌套的。Demo01.csnamespace NameSpaceDemo {internal class Demo01Class{ }namespace NSDemo01{internal class Demo01Class{}}namespace NSDemo…

岛国小姐姐来例假时,男朋友背着她偷偷查手机......

1 大猪蹄子们都好好学学▼2 人形扫地机???▼3 妈,看下你儿子大学四年积攒的宝藏▼4 你以为养老院很无聊?▼5 这个事是全世界统一的吗?▼6 爸爸:今天做个温柔的人吧▼7 那些隐藏在民间的车…

mysql-普通查询(General Query)慢查询(Slow Query)相关日志配置

2019独角兽企业重金招聘Python工程师标准>>> 配置 配置方法一: 服务启动时 # vi /etc/my.cnf ... log-outputTABLE,FILE general-log1 slow-query-log1# systemctl restart mysqldlog-output默认是FILE,还有个值是NONE,就不输出日志了.我这里演示的是表和日志文件都…

eclipse myeclipse 快捷键

MyEclipse 快捷键1(CTRL) ------------------------------------- Ctrl1 快速修复 CtrlD: 删除当前行 CtrlQ 定位到最后编辑的地方 CtrlL 定位在某行 CtrlO 快速显示 OutLine CtrlT 快速显示当前类的继承结构 CtrlW 关闭当前Editer CtrlK 快速定位到下一个 CtrlE…

委托与事件

首先多谢网上的大牛们无私地分享自己的经验,让我这样的小鸟能站在巨人的肩膀上不断前进! 参考网址:http://www.knowsky.com/395937.html(参考1) http://hi.baidu.com/zhangguilin/blog/item/9d34dc17a088ff0ac83d6d08.…

适配器简介

STL 适配器分为 函数对象适配器、迭代器适配器 和 容器适配器 3种,分别完成对应的类型转换。 举例子容易,比如电源插座,3个头的插头插不进两个头的插座,就需要一个适配器。 1、函数适配器: 在stl程序里,有的…

他让全世界凶手睡不着觉,现实版福尔摩斯,退休了4次又被拽回来工作,无敌实在是太寂寞了~...

全世界只有3.14 % 的人关注了爆炸吧知识今天要说一位最近在中国圈粉无数萌萌哒老爷爷他是《挑战不可能》里的李博士也是世界上最牛逼的刑侦鉴识专家DrHenryLee李昌钰人称现实版福尔摩斯他是全球身价最高的鉴识专家之一据说工作酬劳是10000美元/时如果哪个案子他都破不了那这个c…

集成Dapr的 Azure 容器应用

微软在 Ignite 2021 大会上发布了预览版的Azure Container Apps,这是一个完全托管的无服务器容器运行时,用于大规模构建和运行现代应用程序。从2021 年 11 月 2 日起,Azure 容器应用程序可在公共预览中使用。虽在服务到达 GA 之前&#xff0c…

jsp iframe嵌入php,jsp嵌套iframe从iframe中表单提交并传值到外层_html/css_WEB-ITnose

今天因需求迭代 更改元来代码 遇到了这么个问题就是想在 iframe中提交后进行整个页面的跳转 并把iframe中的值传到外层jsp大概就是这个样子外层 a.jsp内层 b.jsp于是想当然的开始码代码打算用js进行赋值 在b.jsp中 写个js$(#d).val();虽然能获取到隐藏域的值 但 外层的值并没有…

浅谈SQL注入风险 - 一个Login拿下Server(转)

前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查。 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都能登录了。不…

java笔试面试经典问题

java面试笔试题大汇总 JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分&#xff0…

设计模式建议学习顺序

学习顺序设计模式常用程度适用层次引入时机结构复杂度变化实现体现的原则1Factory Method很常用代码级编码时简单子类的实例化对象的创建工作延迟到子类开闭原则2Singleton很常用代码级、应用级设计时、编码时简单唯一实例封装对象产生的个数 3Facade很常用应用级、构架级设计时…

MSFT Outlook VBA处理新邮件的方法

俺们有两个邮箱,1个外部的邮箱1(outlook),1个内部邮箱0(lotus notes)。想要outlook邮箱收到新邮件之后判断一下subject的内容,如果是"kkk:"开头,则将"kkk:"后面…

炸了!中国学者首次被Science撤稿,与之前首次被Nature撤稿的教授来自同一所大学……...

全世界只有3.14 % 的人关注了爆炸吧知识两次撤稿并非学术造假?国庆假期结束的第一天,Science杂志将中国地质大学宋怀兵副教授两个月前发表的文章进行了撤稿处理。这也是新中国建国以来,首次被Science撤稿的论文。其实早在8月,Scie…

linux 查询oracle情况,在Linux下使用SQLPlus查看Oracle数据库表空间及使用率

在Linux下进入SQLPlus,# su – oracle$ sqlplus / as sysdbaSQL>查看一个表空间所对应的数据文件SQL>select file_name from dba_data_fileswhere tablespace_name’BING’;FILE_NAME———————————————————————————————————…

如何编写干净流畅的Web API测试

前言当我们为Web API编写测试用例时&#xff0c;代码基本是这样的&#xff1a;public class UnitTest1 {private readonly TestServer _server;private readonly HttpClient _client;public UnitTest1(){// Arrange_server new TestServer(new WebHostBuilder().UseStartup<…

SFB2015 多SIP域

SFB2015 多SIP域最近公司有打算要安装最新的SFB2015作为一个SFB小白 在通读了官方安装文章之后竟然磕磕绊绊的安装成功&#xff0c;客户端登录也是成功的&#xff0c;下面就有一个十分蛋疼的问题 公司内外网域名不一致虽然在进行拓扑准备的时候进行了多SIP域的准备&#xff0c;…

SWFUpload V2.2.0 说明文档

http://leeon.me/upload/other/swfupload.html#overview