【问题标题】:Executing SQL Server stored procedure in ASP.NET Core 3.1 Web API returns -1在 ASP.NET Core 3.1 Web API 中执行 SQL Server 存储过程返回 -1
【发布时间】:2022-01-26 03:21:00
【问题描述】:

我创建了一个 ASP.NET Core 3.1 Web API 项目,并尝试在 SQL Server 中执行现有的存储过程。

但是,它总是返回 -1 而不是它应该返回的 Id。这是我第一次尝试使用 ASP.NET Core,我很难理解它。

这是 SQL Server 存储过程:

ALTER PROCEDURE [dbo].[stp_CheckForExistingEmployee]
    (@FirstName varchar(100),
     @LastName varchar(100), 
     @SSN varchar(3), 
     @MDOB int)
AS
BEGIN
    SELECT TOP 1 Id 
    FROM tbl_Employees
    WHERE Firstname = @FirstName 
      AND LastName = @LastName 
      AND COALESCE(SSN, @SSN) = @SSN 
      AND COALESCE(MDOB, @MDOB) = @MDOB
END

这是我的 C# 代码:

public async Task<int> CheckForExistingEmployee(EmployeeImport model)
{
    object[] parameters =
            {
                new SqlParameter("@FirstName", model.FirstName),
                new SqlParameter("@LastName", model.LastName),
                new SqlParameter("@SSN", model.SSN),
                new SqlParameter("@MDOB", model.MDOB)
            };

    var exists = await context.Database.ExecuteSqlRawAsync("stp_CheckForExistingEmployee  {0}, {1}, {2}, {3}", parameters);

    return exists;
}

【问题讨论】:

  • 与实际问题无关,但如果您使用的是TOP(1),则应该使用ORDER BY;否则你会得到任意值。此外,您应该使用AND (SSN = @SSN OR @SSN IS NULL) 之类的语法,而不是COALESCE(SSN, @SSN) = @SSN,并在OPTION 子句中包含RECOMPILE。见Revisiting catch-all queries
  • 那么 ID -1 是什么,为什么它会返回它?是否符合参数?旁白:您应该明确定义要传递的参数"EXEC stp_CheckForExistingEmployee @FirstName = {0}, @LastNaem = {1}....
  • 我不知道它为什么返回-1,这就是问题所在。它应该返回的 ID 是 56939。我尝试使用 @FirstName 等而不是 {0} 等,但我收到了相同的结果。直接在 sproc 中输入参数会返回预期的结果。它只是不适用于 Core。
  • 从文档中我认为ExecuteSqlRawAsync 返回受影响的行数。不是您尝试做的结果集。我认为您最好使用输出参数,因为它是一个值。

标签: sql-server asp.net-core-webapi


【解决方案1】:
ALTER PROCEDURE [dbo].[stp_CheckForExistingEmployee]
    (@FirstName varchar(100),
     @LastName varchar(100), 
     @SSN varchar(3), 
     @MDOB int,
     @id int output)
AS
BEGIN
    set @id = (SELECT TOP 1 Id 
    FROM tbl_Employees
    WHERE Firstname = @FirstName 
      AND LastName = @LastName 
      AND COALESCE(SSN, @SSN) = @SSN 
      AND COALESCE(MDOB, @MDOB) = @MDOB) 

    return @id
END

【讨论】:

  • 感谢您的建议,但没有帮助。
  • 一个完整的答案解释了除了提供工作代码之外发生了哪些变化。
  • return 语句旨在返回 SP 的状态,而不是这样的值。对于值,应使用输出参数。
猜你喜欢
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 2015-11-02
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多