Dapper总结(二)---事务和存储过程
一 dapper使用事务
1 string sql1 = "insert into UserInfo values('user8',27,'s')"; 2 string sql2 = "insert into RoleInfo values('新角色2')"; 3 conn.Open();//在dapper中使用事务,需要手动打开连接 4 IDbTransaction transaction = conn.BeginTransaction();//开启一个事务 5 try 6 { 7 conn.Execute(sql2, null, transaction); 8 conn.Execute(sql1, null, transaction); 9 10 transaction.Commit();//都执行成功时提交 11 Console.WriteLine("Sucess"); 12 } 13 catch (Exception ex) 14 { 15 16 transaction.Rollback();//只要有一条执行失败,执行回滚 17 Console.WriteLine("Fail"); 18 } 19 conn.Close();
二 dapper执行存储过程
1、有输入输出参数的存储过程
(1)创建存储过程
--插入新用户的存储过程,用户名存在就不插入 create proc sp_insertUser @username nvarchar(50), @roleid int , @age int, @count int out as begin declare @c int; select @c=COUNT(*) from UserInfo where UserName=@username; if(@c!=0) set @count =0; else begin insert into UserInfo values(@username,@age,@roleid); set @count=1; end end GO
(2)c#中使用dapper执行
1 //设置参数 (input为默认参数类型,可以不写的) 2 DynamicParameters dp = new DynamicParameters(); 3 dp.Add("@username", "newuser", DbType.String, ParameterDirection.Input, 50); 4 dp.Add("@age", 20, DbType.Int16, ParameterDirection.Input); 5 dp.Add("@roleid", 2, DbType.Int16, ParameterDirection.Input); 6 dp.Add("@count", 2, DbType.Int16, ParameterDirection.Output); 7 8 //执行存储过程 9 var res = conn.Execute("sp_insertUser", dp, null, null, CommandType.StoredProcedure); 10 int count = dp.Get<int>("@count");//获取output参数的值
2、无参返回多个结果集
(1)创建存储过程
--获取用户和角色表中的所有数据 create procedure sp_getUsesAndRoles as begin select * from UserInfo; select * from RoleInfo; end
(2)c#中使用dapper执行
1 //获取多个结果集 2 Dapper.SqlMapper.GridReader res = conn.QueryMultiple("sp_getUsesAndRoles", null, null, null, CommandType.StoredProcedure); 3 4 //read方法获取user和roles 5 IEnumerable<UserInfo> users = res.Read<UserInfo>(); 6 IEnumerable<RoleInfo> roles = res.Read<RoleInfo>();
分类:
02 SQL/Dapper
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决