16

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

4 回答 4

32

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

——来源

于 2011-11-14T16:52:34.570 回答
8

来自微软:

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

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

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

于 2011-11-14T16:55:27.523 回答
0

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

于 2011-11-14T17:23:14.330 回答
0

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

于 2016-01-27T22:22:45.917 回答