c# - 从 SQL 中的存储过程返回值 true 或 false,并在带有 dapper 的 asp core3 中使用它
问题描述
我有这个存储过程来验证一些信息,我需要这个存储过程是否找到值然后返回 true,如果没有找到任何东西它返回 false。
ALTER PROCEDURE [dbo].[ValidateSubscribeDiscountDate]
(@StartDate datetimeoffset,
@EndDate datetimeoffset)
AS
BEGIN
SELECT
1
FROM
[SubscribeDiscount] SD
WHERE
SD.StartDate = @StartDate
AND SD.EndDeate = @EndDate
END
我在这样的 ASP.NET Core MVC 应用程序中使用它:
public async Task<OperationResult<bool>> ValidateSubscribeDiscount(DateTimeOffset? StartDate, DateTimeOffset? EndDate)
{
using (var userConnection = new SqlConnection(ConnectionString))
{
try
{
var validate = await userConnection.QueryAsync<bool>(
"ValidateSubscribeDiscountDate",
new { StartDate = StartDate, EndDate = EndDate }
);
var response = validate.First();
return OperationResult<bool>.BuildSuccessResult(vlaidate.First());
}
catch (Exception ex)
{
return OperationResult<bool>.BuildFailure(ex.Message);
}
}
}
但我收到此错误:
序列不包含任何元素
有什么问题?我怎么解决这个问题?
解决方案
您的代码失败,因为您在查询结果不包含 WHERE 子句返回的任何记录时使用 First。首先假设您的 IEnumerable 中总有一些东西要返回。您可以将存储过程更改为始终返回一个值,然后从 C# 代码中检查该值
ALTER PROCEDURE [dbo].[ValidateSubscribeDiscountDate]
(
@StartDate datetimeoffset,
@EndDate datetimeoffset
)
AS
BEGIN
IF EXISTS(SELECT 1 FROM [SubscribeDiscount] SD
WHERE SD.StartDate =@StartDate
AND SD.EndDeate=@EndDate)
SELECT 1 ELSE SELECT 0
END
...
var vlaidate = await userConnection.QueryAsync<int>(
"ValidateSubscribeDiscountDate",new
{ StartDate = StartDate, EndDate = EndDate });
bool response = vlaidate.First() == 1 ? true : false;
但可能最好的方法是使用 FirstOrDefault 而不是 First。使用此方法,如果查询未产生任何结果,您将获得 null 返回,并且您可以轻松测试该条件。
var vlaidate = await userConnection.QueryAsync<int>(
"ValidateSubscribeDiscountDate",new
{ StartDate = StartDate, EndDate = EndDate });
bool response = vlaidate.FirstOrDefault() != null ? true : false;
或者,如下所述,即使是对 Any 的简单调用也可以。
bool response = vlaidate.Any();
推荐阅读
- azure - Azure 服务总线高可用性和跨区域复制
- python - 使用 pyautogui 定位相似图像的第二个位置
- javascript - 每次刷新页面时,我的数组中都会添加一个 isTrusted 元素
- html - 删除元素占用的添加区域或高度
- angular - Angular FormArray 未显示其任何 formControl
- python - 看不到函数的输出等于字符串
- java - Android Studio,片段相互叠加
- reactjs - 将 multer 与快速服务器一起使用,我的文件没有上传到服务器
- acumatica - 使用 WarehouseDetails 更新 StockItem
- r - R从数据帧名称的向量返回数据帧