[英]Return value true or false from stored procedure in SQL and use it in asp core3 with dapper
我有這個存儲過程來驗證一些信息,我需要這個存儲過程是否找到值然后返回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 而不是 FirstOrDefault。 使用此方法,如果查詢未產生任何結果,您將獲得空返回,並且您可以輕松測試該條件。
var vlaidate = await userConnection.QueryAsync<int>(
"ValidateSubscribeDiscountDate",new
{ StartDate = StartDate, EndDate = EndDate });
bool response = vlaidate.FirstOrDefault() != null ? true : false;
或者,正如下面評論的那樣,即使是對 Any 的簡單調用也可以。
bool response = vlaidate.Any();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.