#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 или выше «.