【问题标题】:DbContext ExecuteSqlRaw missing parameters errorDbContext ExecuteSqlRaw 缺少参数错误
【发布时间】:2021-03-16 06:45:38
【问题描述】:

我有执行存储过程的代码:

var result = await DbContext.Database.ExecuteSqlRawAsync(
                "Get_FlightBooking @BookingReferenceNumber, @BM_BKDTFOM, @BM_BKDTTO, @User_Id",
                new SqlParameter("@BookingReferenceNumber", model.BookingId == string.Empty ? null : model.BookingId),
                new SqlParameter("@BM_BKDTFOM", model.FromDt == string.Empty ? null : model.FromDt),
                new SqlParameter("@BM_BKDTTO", model.FromDt == string.Empty ? null : model.FromDt),
                new SqlParameter("@User_Id", model.UserId));

这是存储过程:

ALTER Proc [dbo].[Get_FlightBooking]
(

 @BookingReferenceNumber   VARCHAR(50)=NULL,   
 @BM_BKDTFOM  VARCHAR(50)=NULL,  
 @BM_BKDTTO   VARCHAR(50)=NULL,  
 @User_Id  bigint=null
)
as
begin
    SELECT distinct BookingID,
            BookingReferenceNumber,
            Sector,
            AirlineCode,
            AirlineName,
    FROM dbo.Flights AS fb  
    WHERE (fb.BookingReferenceNumber=@BookingReferenceNumber OR @BookingReferenceNumber IS NULL)   
         AND((CAST(fb.BookingDate AS DATE)>= CAST(@BM_BKDTFOM AS DATE) OR @BM_BKDTFOM IS NULL) AND (CAST(fb.BookingDate AS DATE)<=CAST(@BM_BKDTTO AS DATE) OR @BM_BKDTTO IS NULL))  
         AND (fb.UserId=@User_Id or @User_Id=1)
END

是否有人发现存储过程的执行方式有问题?调用 C# 代码时出现此错误:

参数化查询'(@BookingReferenceNumber nvarchar(4000),@BM_BKDTFOM nvarchar(400' 需要参数 '@BookingReferenceNumber',未提供。

知道什么是错的吗?

【问题讨论】:

    标签: c# entity-framework linq entity-framework-core dbcontext


    【解决方案1】:

    您需要使用DBNull.Value 而不是null

    var result = await DbContext.Database.ExecuteSqlRawAsync(
                "UspGet_FlightBooking @BookingReferenceNumber, @BM_BKDTFOM, @BM_BKDTTO, @User_Id",
                new SqlParameter("@BookingReferenceNumber", string.IsNullOrWhiteSpace(model.BookingId) ? DNNull.Value : model.BookingId),
                new SqlParameter("@BM_BKDTFOM", string.IsNullOrWhiteSpace(model.FromDt) ? DNNull.Value : model.FromDt),
                new SqlParameter("@BM_BKDTTO", string.IsNullOrWhiteSpace(model.FromDt) ? DNNull.Value : model.FromDt),
                new SqlParameter("@User_Id", model.UserId));
    

    如果您不能使用 C# 9.0,可以尝试像这样初始化您的 SqlParameters:

     new SqlParameter("@BookingReferenceNumber", System.Data.SqlDbType.NVarChar, 4000)
                { Value = string.IsNullOrWhiteSpace(model.BookingId) ? (object)DBNull.Value : model.BookingId }
    

    【讨论】:

    • 我已经尝试过了,但是在 C# 8.0 中无法获得“功能‘目标类型的条件表达式’。请使用 9.0 或更高版本的语言。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 2020-09-09
    • 2019-10-25
    相关资源
    最近更新 更多