.net中ExecuteNonQuery方法,返回操作行数,用存储过程时,为啥总是返回-1呢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.net中ExecuteNonQuery方法,返回操作行数,用存储过程时,为啥总是返回-1呢相关的知识,希望对你有一定的参考价值。

同题。
插入数据时,数据还都已经插入数据库了。我专门试过使用非法字符。返回0。。
但是这种返回-1的却都还插入成功了。。这是为什么?

参考技术A 对于 UPDATE、INSERT 和 DELETE 语句,返回值为该命令所影响的行数。对于所有其他类型的语句,返回值为 -1。如果发生回滚,返回值也为 -1。

你是select语句啊。你说会返回什么?

我觉得ExecuteScalar()会比较适合你现在的情况。
http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlcommand.executescalar(v=VS.80).aspx
参考技术B 你的存储过程怎么写的?在数据库执行存储过程看能不能成功,如果能说明你页面代码有问题,不能,存储过程有问题本回答被提问者和网友采纳 参考技术C 贴一下你写的程序咯。 参考技术D 能把你的具体存储过程贴出来吗?这样才能分析。 第5个回答  2011-11-07 语句没写好。。。追问

不是这的问题。。

c#: ExecuteNonQuery() 返回 -1

【中文标题】c#: ExecuteNonQuery() 返回 -1【英文标题】:c#: ExecuteNonQuery() returns -1 【发布时间】:2011-12-28 19:52:34 【问题描述】:

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

【问题讨论】:

所以表中的修改实际上发生了,但你得到-1? 它可能会返回你的存储过程返回的任何东西,如果没有另外指定,它可能是 -1.. 您是否真的使用分析器捕获了 SQL 调用并手动执行以查看实际更改的行号? 存储过程的代码在哪里? ExecuteNonQuery() 的可能重复项 【参考方案1】:

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

--source

【讨论】:

【参考方案2】:

来自微软:

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

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于.net中ExecuteNonQuery方法,返回操作行数,用存储过程时,为啥总是返回-1呢的主要内容,如果未能解决你的问题,请参考以下文章

c#: ExecuteNonQuery() 返回 -1

C# sqlserver ExecuteNonQuery()方法详解

ExecuteNonQuery,ExecuteReader,ExecuteScalar 区别

此 SQL 代码在 SMMS 中执行时有效,但在 .Net 中通过 ExecuteNonQuery() 调用时无效,为啥?

对 ExecuteNonQuery 的 Postgres 函数(通过 npgsql)调用返回 -1 作为受影响行的结果

ExecuteNonQuery 命令中缺少参数,在 VB.NET 和 Access 中使用