Dapper连接与事务的简单封装
增删改查方面,已经有Dapper.Extension这么强大的工具了,我也实在没啥好写的,就随手写了个看起来比较优雅的连接与事务的封装。在之后使用Dapper.Extension类库时,完全可以照搬进去。
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using Dapper;
using DapperDemo.Models;
namespace DapperDemo
{
internal class Program
{
public static string ConnString = "Server=(localdb)\\MSSQLLocalDB;Database=DapperDB;";
private static void Main(string[] args)
{
BuckInsert();
BuckInsert();
BuckInsert();
DeleteAfterUpdating();
GetPersonList().ForEach(c=>Console.WriteLine(c.UserName));
}
public static List<Person> GetPersonList()
{
var people = new List<Person>();
ExecuteWithoutTransaction(conn =>
{
people = conn.Query<Person>("select * from Person where id>@id", new {id = 2}).ToList();
});
return people;
}
public static bool BuckInsert()
{
return ExecuteWithTransaction((conn, trans) =>
{
var r = conn.Execute(
@"insert Person(username, password,age,registerDate,address) values (@a, @b,@c,@d,@e)",
new[]
{
new {a = 1, b = 1, c = 1, d = DateTime.Now, e = 1},
new {a = 2, b = 2, c = 2, d = DateTime.Now, e = 2},
new {a = 3, b = 3, c = 3, d = DateTime.Now, e = 3}
},trans);
return r;
});
}
public static bool Update()
{
return ExecuteWithTransaction((conn, trans) =>
{
var r = conn.Execute(@"update Person set password='www.lanhuseo.com' where username=@username",
new {username = 2}, trans);
return r;
});
}
public static bool Delete()
{
return ExecuteWithTransaction((conn, trans) =>
{
var r = conn.Execute(@"delete from Person where id=@id", new {id = 1009}, trans);
return r;
});
}
public static bool DeleteAfterUpdating()
{
return ExecuteWithTransaction((conn, trans) =>
{
var r = conn.Execute(@"update Person set password='www.lanhuseo.com' where id=@id", new {id = 1009}, trans,
null, null);
r += conn.Execute("delete from Person where id=@id", new {id = 1010}, trans, null, null);
return r;
});
}
/// <summary>
/// Used for query
/// </summary>
/// <param name="action"></param>
public static void ExecuteWithoutTransaction(Action<SqlConnection> action)
{
UseConnectObj(action);
}
/// <summary>
/// Used for cud
/// </summary>
/// <returns>Execute Result</returns>
/// <param name="func"></param>
public static bool ExecuteWithTransaction(Func<SqlConnection, IDbTransaction, int> func)
{
var r = 0;
UseConnectObj(conn =>
{
IDbTransaction trans = conn.BeginTransaction();
r = func(conn, trans);
trans.Commit();
});
return r > 0;
}
/// <summary>
/// Use Action Connection
/// </summary>
/// <param name="action"></param>
public static void UseConnectObj(Action<SqlConnection> action)
{
using (var conn = new SqlConnection(ConnString))
{
conn.Open();
action(conn);
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端