从 SQL 中的存储过程返回值 true 或 false,并在带有 dapper 的 asp core3 中使用它
Posted
技术标签:
【中文标题】从 SQL 中的存储过程返回值 true 或 false,并在带有 dapper 的 asp core3 中使用它【英文标题】:Return value true or false from stored procedure in SQL and use it in asp core3 with dapper 【发布时间】:2020-04-28 23:19:36 【问题描述】:我有这个存储过程来验证一些信息,我需要这个存储过程找到值然后返回真,如果没有找到任何东西它返回假。
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);
但我收到此错误:
序列不包含任何元素
有什么问题?我该如何解决这个问题?
【问题讨论】:
查看这里以获得更多帮助***.com/a/8386227/5829426 【参考方案1】:您的代码失败,因为当查询结果不包含 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();
【讨论】:
在第二个建议中,由于您实际上并没有使用FirstOrDefault()
返回的值,您可以简单地说bool response = vlaidate.Any()
或使用case
表达式并返回bit
:select Cast( case when exists ( select 42 from SubscribeDiscount where StartDate = @StartDate and EndDate = @EndDate ) then 1 else 0 end as Bit ) as Valid;
。 (或者是真的 EndDeate
?)以上是关于从 SQL 中的存储过程返回值 true 或 false,并在带有 dapper 的 asp core3 中使用它的主要内容,如果未能解决你的问题,请参考以下文章
如何从 ASP.NET Core Web API 中的 SQL Server 存储过程中获取返回值
使用 SQL Server 2012 中的 MSSQL_Query 的 PHP 调用存储过程返回无效值