【问题标题】:ExecuteScalarAsync() does not return the same value returned from stored procedureExecuteScalarAsync() 不返回从存储过程返回的相同值
【发布时间】:2021-07-01 02:46:17
【问题描述】:

我有一个返回正整数或 -1 的存储过程。 我有这个代码调用那个存储过程,我不知道为什么它不能捕获从存储过程返回的值

    SqlConnection sqlConn = GetNewSqlConnection();
    await sqlConn.OpenAsync();

    try
    {
        var ret = await sqlConn.ExecuteScalarAsync<int>(
                "dbo.Usp_Comment_Update",
                new
                {
                    CommentID_in = model.CommentID,
                    Comment_in = model.Comment,
                    CommentTypeID_in = model.CommentTypeID,
                    SortIndex_in = model.SortIndex,
                    UpdatedBy_in = model.UpdatedBy
                },
                commandType: CommandType.StoredProcedure);

        return (int)ret;
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
        if (sqlConn.State != ConnectionState.Closed)
        {
            sqlConn.Close();
        }

        sqlConn.Dispose();
    }

存储过程

DECLARE @RowAffected    INT
SET NOCOUNT ON;

UPDATE dbo.DB_Comments 
SET  [Comment]       =  @Comment_in 
    ,[CommentTypeID] =  @CommentTypeID_in
    ,[SortOrder]     =  @SortIndex_in
    ,[UpdatedBy]     =  @UpdatedBy_in
    ,[UpdatedDate]   =  GETDATE()
WHERE CommentID = @CommentID_in

SET @RowAffected = @@ROWCOUNT
PRINT @RowAffected 

IF @RowAffected > 0
    RETURN @RowAffected 
ELSE
    RETURN -1

上面的代码总是返回 0。我在这里读过一篇文章,建议看看返回数据类型是什么。所以我在 ExecuteScalarAsync 之后删除并在 Watch 窗口中查找变量 ret,它是一个空对象。连接字符串是正确的,它连接到正确的数据库,因为在调用之后,数据按预期更新。我什至尝试删除存储过程中除了 RETURN -1 之外的所有内容,但我仍然从 ExecuteScalarAsync 得到 0。

我做错了什么,在这里?

【问题讨论】:

标签: c# executescalar


【解决方案1】:

在您的存储过程中删除此SET NOCOUNT ON 以获得@@ROWCOUNT 的正确值。

更多详情请查看SET NOCOUNT (Transact-SQL)

不要使用RETURN -1,而是使用SELECT -1。标量值是一个类似结果的表,具有单个值(1 行 1 列)。

【讨论】:

猜你喜欢
  • 2017-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多