存储过程总是 returns 0,即使里面的过程工作正常

Stored procedure always returns 0, even if the process inside works fine

我正在编写一个用于删除数据的存储过程。只有当没有字段连接到该程序时,它才应该删除该程序。

我的逻辑是先按Id统计TA_Program相关的列,如果统计到returns0则删除程序,如果returns-3则提示字段连接,以及互联网连接警报。

然而,即使删除过程本身运行良好,存储过程总是 returns 0,所以我总是出现失败警报。

我读了几篇关于 @@ROWCOUNTdeleteROWCOUNT 之间的关系的帖子,但每次尝试都返回 0,没有别的。你能帮我解决这个问题吗?

这是我的存储过程及其查询方式。

CREATE PROCEDURE SP_Delete_Program_By_Id 
    (@Id int)
AS
BEGIN
    DECLARE @FieldCount AS int
    DECLARE @ResultCount AS int
    
    -- count FieldId Where Id = @Id
    SELECT @FieldCount = (SELECT COUNT(*) FROM TA_Field (Nolock) WHERE Id = @Id)
       
    -- if no Field is connected, delete program
    IF @FieldCount = 0
    BEGIN
        DELETE FROM TA_Program
        WHERE Id = @Id

        SELECT @FieldCount = (SELECT COUNT(*) FROM TA_Program (Nolock) WHERE Id = @Id)

        IF @FieldCount = 0
            SELECT @ResultCount = 1
        ELSE
            SELECT @ResultCount = -1
    END
    ELSE
        SELECT @ResultCount = -3

    RETURN @ResultCount
END

C# 代码:

    public static int DeleteProgram(Program obj)
    {
        int result = -1;

        // Sort is for determining db id and pw stored 
        using (var db = DBConnectionHelper.GetConnection(Sort.Program))
        {
            var param = new DynamicParameters();
            //param.Add("@FieldId", obj.FieldId);
            param.Add("@Id", obj.Id, dbType: DbType.Int32);
            result = db.Query<int>("APISP_Delete_Program_By_Id", param: param, commandType: CommandType.StoredProcedure).SingleOrDefault<int>();
        }

        return result;
        // this always returns 0
    }

    [HttpPost]
    public APIResult DeleteProgram(string session, Program program)
    {
        int deleteResult = ProgramsDbHelper.DeleteProgram(program);

        if (deleteResult == 1)
        {
            result.ResultCode = 1;
            return result;
        }

        if (deleteResult == -3)
        {
            result.ResultCode = -3;
            return result;
        }            

        return result;
    }

您的程序有很多问题

  • 您的主要问题:使用 RETURN 而不是 SELECT
  • 应避免使用 NOLOCK
  • 应避免使用 sp_ 前缀
  • 假设 TA_FieldTA_Program 的外键,逻辑没有意义:因为你没有交易并且没有使用 HOLDLOCK, UPDLOCK,另一个可能用户在你的 SELECT COUNTDELETE 之间插入 TA_Program,此时你会得到一个错误,并且程序的其余部分不会 运行。如果没有人插入那么额外的 SELECT COUNT 就没用了,因为数据没有改变。
  • 您实际上不需要任何逻辑,因为您可以将其组合在 DELETE 语句中(无论如何每个语句都在其自己的事务中)。

因此您的程序应该如下所示:

CREATE PROCEDURE Delete_Program_By_Id 
    (@Id int)
AS

SET NOCOUNT ON;

DELETE FROM TA_Program
WHERE Id = @Id
  AND NOT EXISTS (SELECT 1
      FROM TA_Field
      WHERE Id = @Id);
  
SELECT CASE WHEN @@ROWCOUNT > 0 THEN 1 ELSE -3 END;

GO