更新存储过程在 SQL Server 中不起作用

Posted

技术标签:

【中文标题】更新存储过程在 SQL Server 中不起作用【英文标题】:Update stored procedure not working in SQL Server 【发布时间】:2021-06-12 13:20:35 【问题描述】:

我有一个存储过程,通过将 bool 值从 1 更改为 0 来更新状态。我将用户 ID 传递给存储过程。我只需要更新用户状态。但现在它不这样做了。

CREATE PROCEDURE [dbo].[UpdateStatus]
    @userID INT
AS
BEGIN
    UPDATE [dbo].[User]
    SET Status = 0 
    WHERE Id = @userID
END

我正在调用这个存储过程:

public User UpdateStatus(string UserId)

        User userDetails = new User();

        try
        
            using (SqlConnection sqlConnection = new SqlConnection(connection.GetConnectionString()))
            
                sqlConnection.Open();
                SqlCommand cmd = new SqlCommand("UpdateStatus", sqlConnection);
                cmd.Parameters.Add(new SqlParameter("@userID", UserId));
                cmd.CommandType = CommandType.StoredProcedure;

                using (SqlDataReader reader = cmd.ExecuteReader())
                
                    while (reader.Read())
                    
                           userDetails.DisplayName = reader["DisplayName"].ToString();
                    
                

                sqlConnection.Close();
            
        
        catch(Exception ex)
        
            //ex.Message;
        

        return userDetails;

我正在调用UpdateStatus 函数。但它不会更新数据库中的状态

【问题讨论】:

一个 UPDATE 语句不会返回一个阅读器来阅读一些东西 “但它没有返回任何东西。” 为什么会这样?该过程未返回数据集。您将从该过程中获得的唯一信息是RETURN 状态,这可能是0 成功。 应该是executenonquery。您应该在另一个查询中进行选择。 好吧,如果 OP确实 需要返回数据,他们可能会使用 OUTPUT 子句 @MonkeyDLuffy @Larnu 它没有更新数据库。所以返回状态为 0,预期为 1 【参考方案1】:

我的这个答案完全基于此评论的猜测:

它没有更新数据库。所以返回状态为 0,预期为 1

更新0 行且没有错误的UPDATE 仍然是一条成功的语句。我怀疑您正在传递@userID 的值,其中没有具有ID 值的行。这不会导致RETURN 状态为1 或其他任何值。如果您希望在没有更新任何行时发生故障,请检查 @@ROWCOUNT 的值。然后是THROWRETURN

CREATE PROCEDURE [dbo].[UpdateStatus] @userID INT AS
BEGIN
    UPDATE [dbo].[User]
    SET Status=0 
    WHERE Id = @userID;

    --RETURN example
    IF @@ROWCOUNT = 0
        RETURN 1; --Denote "failure"
    ELSE
        RETURN 0; --Denote Success

    --Or perhaps you want to THROW
    IF @@ROWCOUNT = 0
        THROW 89001, N'No rows were updated.',10; --USe a custom Error code appropriate for your application

END;

【讨论】:

如何在 c# 代码中使用这个@@ROWCOUNT。我尝试的是 cmd.Parameters.AddWithValue("@userID", UserId); var effectedRows = Convert.ToInt32(cmd.Parameters["@@ROWCOUNT"].Value);这有一个例外。 嗯? @@ROWCOUNT 是 SQL Server 中的系统变量,您无法在 C# 中访问它。它在程序中处理。如果您希望返回 @@ROWCOUNT 的值,您可以使用 OUTPUT 参数,但这是一个完全不同的问题 请您提供任何有用的材料 how to use SQL Server OUTPUT parameters in C#@developer. ExecuteNonQuery 无论如何都会返回行数,只要NOCOUNT OFF

以上是关于更新存储过程在 SQL Server 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Intellisense 在 SQL Server Management Studio 中不起作用。可能是啥原因?

部分更新在过程中不起作用

更新语句不起作用

OPENJSON 在 SQL Server 中不起作用?

Datetime BETWEEN 语句在 SQL Server 中不起作用

Ctrl R 在 SQL Server 2012 中不起作用