You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 23:15:04