为什么 ExecuteNonQuery() 总是返回 -1?

问题描述 投票:0回答:4

我之前使用过此方法来返回更改的行数。我是运行插入方法,插入在存储过程中运行良好,但是

ExecuteNonQuery()
的返回值始终返回
-1

这是我的 C# 代码:

int ret = 0;

using (SqlConnection conn = new SqlConnection(this.ConnectionString))
{
    using (SqlCommand cmd = new SqlCommand(QueryName, conn))
    {
        conn.Open();

        if (Params != null)
            cmd.Parameters.AddRange(Params);

        cmd.CommandType = CommandType.StoredProcedure;
        
        ret = cmd.ExecuteNonQuery();

        conn.Close();
    }
}

return ret;

为什么我得到 -1 而不是实际更改的行数?

c# executenonquery
4个回答
34
投票

如果您使用此方法调用执行的存储过程 在表中 UPDATE/INSERT 如果存储的过程返回 -1 SET NOCOUNT 为 ON 值。

--来源


9
投票

来自微软:

对于 UPDATE、INSERT 和 DELETE 语句,返回值是受命令影响的行数。当正在插入或更新的表上存在触发器时,返回值包括受插入或更新操作影响的行数以及受触发器影响的行数。对于所有其他类型的语句,返回值为-1。如果发生回滚,返回值也是-1。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx

您可能会得到 -1,因为您正在使用存储过程而不是直接表更改


0
投票

您从存储过程返回什么值?你能显示你的存储过程的代码吗?您可能需要编辑存储过程以返回所需的值,或者,您的存储过程专门返回 -1,或者存储过程返回的变量的值为 -1。


0
投票

从存储过程中获取行计数输出,类似于使用

@rowCount=@@Rowcount
。在 DAL 中,使用
dbManager.AddOutParameter("RowCount", DbType.Int32, rowCount);
然后在最后几行中您将得到
(int)dbManager.GetParameterValue("RowCount")

© www.soinside.com 2019 - 2024. All rights reserved.