- 删除操作同样使用
db.Execute(),执行DELETE语句,返回受影响行数。 - 删除一般依靠唯一主键ID定位目标数据。
- 必须添加
WHERE条件!缺少WHERE会清空整张表。 - 反面案例:字符串拼接SQL,存在SQL注入风险;✅标准写法:参数化查询。
原文说明:删除实体通常依靠唯一Id标识;SQL核心为
DELETE ... WHERE 主键=值
如下例子容易导致SQL注入
// 危险写法:字符串拼接,容易SQL注入
using (IDbConnection db = new MySqlConnection(conn))
{
var id = 1;
string sqlQuery = "DELETE FROM student WHERE Id = " + id;
int rowsAffected = db.Execute(sqlQuery);
// 查询验证删除结果
var info = db.Query<Student>("SELECT * FROM student WHERE Id = " + id).SingleOrDefault();
}Code language: C# (cs)
标准参数化写法
using System.Data;
using MySql.Data.MySqlClient;
using Dapper;
using System.Configuration;
static void Main(string[] args)
{
var conn = ConfigurationManager.ConnectionStrings["StudentConnection"].ConnectionString;
using (IDbConnection db = new MySqlConnection(conn))
{
// 删除SQL,使用参数占位符
string sqlDelete = "DELETE FROM student WHERE Id = @Id";
int targetId = 1;
// 执行删除,匿名类传递参数
int rowsAffected = db.Execute(sqlDelete, new { Id = targetId });
// 查询验证:删除后查询结果应为null
var student = db.Query<Student>(
"SELECT * FROM student WHERE Id = @Id",
new { Id = targetId }
).SingleOrDefault();
}
Console.ReadKey();
}
// Student实体类
public class Student
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
}Code language: C# (cs)
使用实体对象传参
string sqlDelete = "DELETE FROM student WHERE Id = @Id";
var stu = new Student { Id = 1 };
int rowsAffected = db.Execute(sqlDelete, stu);Code language: C# (cs)
说明
- 返回值说明
rowsAffected > 0:成功删除对应行数;rowsAffected = 0:没有找到匹配数据。 - 高危提醒
DELETE FROM student;不带条件,直接清空整张数据表,严禁误写。 - 安全规范
外部传入的id、条件,一律使用参数@xxx,禁止直接拼接字符串。
Previous: 更新操作
Next: Dapper 存储过程