【问题标题】:Return value true or false from stored procedure in SQL and use it in asp core3 with dapper从 SQL 中的存储过程返回值 true 或 false,并在带有 dapper 的 asp core3 中使用它
【发布时间】: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);
            }
        }
}

但我收到此错误:

序列不包含任何元素

有什么问题?我该如何解决这个问题?

【问题讨论】:

标签: c# sql tsql asp.net-core


【解决方案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?)
猜你喜欢
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
  • 2022-07-29
  • 1970-01-01
  • 2012-09-06
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多