如何向FromSqlRaw传参调用存储过程,解决标量变量未声明报错?
错误原因
报错是因为FromSqlRaw直接传入值参数时,无法自动匹配SQL语句中定义的@month、@year参数名,有两种常用的正确传参方案:
方案1:显式声明SqlParameter匹配参数名
先引用命名空间using Microsoft.Data.SqlClient;,代码如下:
using(DAD_BaldipContext ctx = new DAD_BaldipContext()) { int month = 02; int year = 2018; var parameters = new[] { new SqlParameter("@month", month), new SqlParameter("@year", year) }; var x = ctx.TruckRentalPb.FromSqlRaw("EXEC TotalMonthlyRental @month, @year", parameters).ToList(); }
方案2:使用索引占位符传参
这种写法更简洁,EF Core会按顺序自动绑定参数,无需手动声明参数名:
using(DAD_BaldipContext ctx = new DAD_BaldipContext()) { int month = 02; int year = 2018; var x = ctx.TruckRentalPb.FromSqlRaw("EXEC TotalMonthlyRental {0}, {1}", month, year).ToList(); }
额外注意事项
你的代码还存在返回值不匹配的问题:
- 你编写的存储过程返回的是
Month、TotalRental两个字段,没有返回TruckId字段,和TruckRentalPb实体的结构不匹配,会导致后续读取字段时报错 - 建议先定义无键实体类型接收存储过程的返回结果,示例:
// 定义返回结果类 public class MonthlyRentalResult { public int Month { get; set; } public decimal TotalRental { get; set; } } // 在DbContext中注册无键实体 protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<MonthlyRentalResult>().HasNoKey(); } // 调用时用对应类型接收结果 var result = ctx.Set<MonthlyRentalResult>().FromSqlRaw("EXEC TotalMonthlyRental {0}, {1}", month, year).ToList(); textbox.Text = result.FirstOrDefault()?.TotalRental.ToString() ?? "0";
内容的提问来源于stack exchange,提问作者BoogieMan
相关产品推荐
相关产品推荐

