Dapper是一个轻量级的ORM框架,它扩展了IDbConnection接口,提供了ExecuteAsync方法用于异步执行不返回结果集的SQL命令,比如插入、更新和删除操作。相比同步的Execute方法,ExecuteAsync能在等待数据库响应时释放当前线程,适合在Web接口中使用。

ExecuteAsync基本用法
使用ExecuteAsync前需要获取一个开放的数据库连接,通常来自SqlConnection。下面示例展示如何异步插入一条用户记录。
using System;
using System.Data.SqlClient;
using System.Threading.Tasks;
using Dapper;
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
public static async Task InsertUserAsync()
{
// 连接字符串请根据实际环境修改
string connStr = "Server=.;Database=TestDb;Integrated Security=true;";
using var connection = new SqlConnection(connStr);
await connection.OpenAsync();
var user = new User { Name = "张三" };
// 异步执行插入
int rows = await connection.ExecuteAsync(
"INSERT INTO Users(Name) VALUES(@Name)", user);
Console.WriteLine($"受影响行数: {rows}");
}
异步更新与删除
更新和删除的写法与插入完全一致,只是SQL语句不同。ExecuteAsync返回受影响的行数,可用于判断操作是否生效。
public static async Task UpdateAndDeleteAsync()
{
string connStr = "Server=.;Database=TestDb;Integrated Security=true;";
using var connection = new SqlConnection(connStr);
await connection.OpenAsync();
// 异步更新
int updateRows = await connection.ExecuteAsync(
"UPDATE Users SET Name=@Name WHERE Id=@Id",
new { Name = "李四", Id = 1 });
// 异步删除
int deleteRows = await connection.ExecuteAsync(
"DELETE FROM Users WHERE Id=@Id",
new { Id = 1 });
}
在事务中执行异步命令
当多个写操作需要保证原子性时,可以开启事务并用同一连接执行ExecuteAsync。注意要传递事务对象给方法。
public static async Task TransactionAsync()
{
string connStr = "Server=.;Database=TestDb;Integrated Security=true;";
using var connection = new SqlConnection(connStr);
await connection.OpenAsync();
using var tx = connection.BeginTransaction();
try
{
await connection.ExecuteAsync(
"INSERT INTO Users(Name) VALUES(@Name)",
new { Name = "王五" }, tx);
await connection.ExecuteAsync(
"UPDATE Users SET Name=@Name WHERE Id=@Id",
new { Name = "赵六", Id = 2 }, tx);
tx.Commit();
}
catch
{
tx.Rollback();
throw;
}
}
常见注意事项
- 调用ExecuteAsync前必须确保连接已打开,或让Dapper自动打开,但显式OpenAsync更可控。
- 参数尽量使用匿名对象或实体类,Dapper会自动映射属性到SQL参数。
- 在ASP.NET Core中,应将连接字符串放在配置文件中,不要硬编码。
- 异步方法调用链上都要加await,避免漏掉async导致死锁或线程阻塞。
提示:如果方法中只是执行单条SQL,也可以不用using包裹连接而交给Dapper管理,但手动控制连接生命周期更利于排查连接泄漏。
小结
通过ExecuteAsync方法,我们可以用简洁的代码完成Dapper的异步增删改。结合事务和参数化查询,既能提升性能也能保障数据安全。实际项目中建议统一封装数据库访问层,让业务代码更专注逻辑本身。
DapperExecuteAsync异步增删改修改时间:2026-07-28 14:24:22