c#: ExecuteNonQuery() returns -1

本文关键字:returns ExecuteNonQuery | 更新日期: 2023-09-27 18:14:48

我以前使用过这个方法来返回更改的行数。我想运行一个插入方法,插入在存储过程中运行良好,但是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() returns -1

如果使用此方法调用存储过程,则执行在一个表中进行UPDATE/INSERT,如果存储过程发生,方法返回-1设置NOCOUNT为ON

——源

From Microsoft:

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

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

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

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

获取存储过程的行数输出,类似于使用@rowCount=@@Rowcount。在DAL中,使用dbManager.AddOutParameter("RowCount", DbType.Int32, rowCount);,然后在最后一行中,您将获得(int)dbManager.GetParameterValue("RowCount")