1. 使用 ExecuteSqlRaw 执行非查询 SQL 语句(也有异步ExecuteSqlRawAsync方法)
ExecuteSqlRaw 方法允许你执行一个原始的 SQL 语句,并返回受影响的行数。这是一个非常强大的工具,可以用来执行任何你需要的 SQL 命令。
示例代码
假设我们有一个简单的 Employee 模型:
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public decimal Salary { get; set; }
}
// 执行更新方法
public static void UpdateEmployee(){
using (var context = new EmployeeContext())
{
// 更新所有名字为 "John" 的员工的薪水
int rowsAffected = context.Database.ExecuteSqlRaw(
"UPDATE Employees SET Salary = @newSalary WHERE Name = @name",
new SqlParameter("@newSalary", 55000),
new SqlParameter("@name", "John")
);
Console.WriteLine($"{rowsAffected} rows affected.");
}
}
2. 使用 ExecuteSqlInterpolated/ExecuteSqlInterpolatedAsync 执行非查询 SQL 语句
ExecuteSqlInterpolated 方法类似于 ExecuteSqlRaw,但是它使用 C# 的插值字符串语法来构造 SQL 语句,这使得代码更加简洁易读。
示例代码
同样使用上面的例子,我们可以用 ExecuteSqlInterpolated 来更新员工的薪水:
public static void UpdateEmployee(){
using (var context = new EmployeeContext())
{
// 更新所有名字为 "John" 的员工的薪水
int rowsAffected = context.Database.ExecuteSqlInterpolated(
$"UPDATE Employees SET Salary = {55000} WHERE Name = {nameof(John)}"
);
Console.WriteLine($"{rowsAffected} rows affected.");
}
}
static async Task<int> SqlTextNonQuery()
{
using (var mydb = new MyDbContext())
{
// 内插值 => $"1{数据}2"; 恒等于 "1"+数据+"2"
// EFCore 使用内插值插入数据 可以防止sql注入 推荐使用 因为:字符串内插如果给string变量赋值,就是字符串拼接;字符串内插如果赋值给FormattableString变量,
// 编译器就会构造FormattableString对象,可以打印一下FormattableString对象看看
var parm = "张三";
FormattableString sql = $"insert into Employees(names,age,Salary) values({parm},{23},5500);";
Console.WriteLine(sql.Format + "param=" + string.Join(',', sql.GetArguments().ToArray())); // insert into Employees(names,id,value) values({0},{23},5500);param=张三,23
return await mydb.Database.ExecuteSqlInterpolatedAsync(sql);
}
}