【问题标题】:Update stored procedure not working in SQL Server更新存储过程在 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

标签: c# .net sql-server stored-procedures


【解决方案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 参数,但这是一个完全不同的问题
  • 请您提供任何有用的材料
  • ExecuteNonQuery 无论如何都会返回行数,只要NOCOUNT OFF
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多