EFCore中执行非查询SQL脚本

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);
     }
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值