c# - DbContext ExecuteSqlRaw 缺少参数错误
问题描述
我有执行存储过程的代码:
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'。
知道有什么问题吗?
解决方案
你需要使用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 }
推荐阅读
- python - 将格式为 mm:ss 的对象数据类型列转换为时间格式 pandas
- stenciljs - StencilJS Click 方法没有被调用
- r - 更新闪亮输入以匹配其他闪亮输入:无限循环
- php - 将 $_GET 变量始终保留为“ac”或“ar”值
- vue.js - 带有 vue-cli 的 nginx proxy_pass 太慢了
- javascript - JS如何在语句块中声明没有词法范围的变量和函数?
- css - css 网格溢出父圆。如何强制css网格遵守?
- python - 从列表组合生成 Python 字典
- python - 在CMD编译环境中,引入自己编写的模块提示“No module named”
- ios - 尝试在 iOS 上删除项目会导致权限被拒绝错误 -rashItem(at:resultingItemURL:)