c#:ExecuteNonQuery()返回-1

时间:2011-11-14 16:49:29

标签: c# executenonquery

之前我使用过这种方法来返回更改的行数。我是运行insert方法,插入在存储过程中运行正常,但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而不是实际改变的行数?

4 个答案:

答案 0 :(得分:23)

  

如果使用此方法调用执行的存储过程   如果存储的procudere,则表中的UPDATE / INSERT方法返回-1   将SET NOCOUNT设置为ON值。

- source

答案 1 :(得分:7)

来自Microsoft:

  

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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