Ошибка отсутствия параметров DbContext ExecuteSqlRaw

#c# #entity-framework #linq #entity-framework-core #dbcontext

#c# #entity-framework #linq #сущность-фреймворк-ядро #dbcontext

Вопрос:

У меня есть этот код для выполнения хранимой процедуры:

 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’, который не был указан.

Есть идеи, что может быть не так?

Ответ №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 }
 

Комментарии:

1. Я уже пробовал это, но получение «функции «целевого условного выражения» недоступно в C # 8.0. Пожалуйста, используйте языковую версию 9.0 или выше «.