c# ExecuteNonQuery 总是返回零

Posted

技术标签:

【中文标题】c# ExecuteNonQuery 总是返回零【英文标题】:c# ExecuteNonQuery always returns Zero 【发布时间】:2011-10-14 16:18:57 【问题描述】:

我认为连接没有问题,因为当我打开它时,它不会引发任何错误。所以我猜错误是在我执行命令时。这是我的代码:

OleDbCommand cmd = new OleDbCommand("SELECT * FROM cars", conn);
cmd.CommandType = CommandType.Text;
int numbers = cmd.ExecuteNonQuery();

我尝试使用消息框显示numbers 的值,但结果始终为0。表cars 包含5 条记录。那么为什么我没有得到正确的结果呢?..

【问题讨论】:

【参考方案1】:

对于匿名投票者,OP 的关键部分:

我尝试使用消息框来显示数字的值,但是 结果始终为 0。表 cars 包含 5 条记录。那我为什么不 得到正确的结果?..

显然,OP 试图获取表中的记录计数(标量聚合),而不是所有表数据。

我的回答:

这是因为您的查询返回的是表而不是标量值,并且您调用了错误的函数。您的查询应该是:

"SELECT COUNT(*) FROM cars"

而且 ExecuteNonQuery 实际上并不期望返回任何结果。 (您通常使用 ExecuteNonQuery 运行插入、更新和删除操作。)您应该使用 ExecuteScalar,它需要一个单值结果,例如 count(*)。

现在大家一起:

OleDbCommand cmd = new OleDbCommand("SELECT count(*) FROM cars", conn);
cmd.CommandType = CommandType.Text;
int numbers = cmd.ExecuteScalar();

【讨论】:

对于像他展示的 select * 查询,ExecuteScalar 没有帮助。 酷!好的!虽然还不能接受,但它告诉我“您可以在 6 分钟后接受答案”。 hehe 无论如何,谢谢!但是我怎样才能获得不同的字段,例如 id、name 等?.. @DavidePiras:如果您仔细阅读问题,您会发现查询不正确。 OP 正在尝试获取聚合...表中的记录计数。 不,因为问题不清楚,他提到了数字,但没有明确汇总......无论如何我没有投票给你。 @DavidePiras:不,问题并不明确,但含义很明确。 OP 期望返回一个数字。表中的项目数。这些术语未使用,但它是一个标量的聚合值。 count(*) 是一个聚合函数。【参考方案2】:

尝试使用应该给您计数的 ExecuteScalar。 ExecuteNonQuery 不会从您的查询中返回结果。您查看的返回值表明您的语句影响了多少行,在您的情况下为零。

【讨论】:

【参考方案3】:

ExecuteNonQuery 顾名思义告诉您不进行查询。它通常用于插入或更新并返回受影响记录的数量。对于您提供的查询,您应该使用 ExecuteReader 或 DataAdapter 及其 Fill 方法来填充数据表。

【讨论】:

【参考方案4】:

因为您正在执行查询,而 ExecuteNonQuery 返回受影响的行数,当您选择时,该行数始终为 0,因为您没有更改任何内容(即 INSERT、UPDATE 或 DELETE)

【讨论】:

【参考方案5】:

ExecuteNonQuery 仅返回受 UPDATE、DELETE 或 INSERT 操作影响的行数。对于SELECT语句中的行数,试试:

OleDbCommand cmd = new OleDbCommand("SELECT * FROM cars", conn);
OleDbDataReader reader = cmd.ExecuteReader();

int numbers = 0;
while (reader.Read())

    //// other Reader-related operations here...

    numbers++;

【讨论】:

但这真的很糟糕,如果他需要一个计数应该在 SQL 中计数而不是所有记录的客户端循环! 同意,COUNT 要好得多,但我假设 OP 可能希望将结果集用于其他目的。

以上是关于c# ExecuteNonQuery 总是返回零的主要内容,如果未能解决你的问题,请参考以下文章

C# sqlserver ExecuteNonQuery()方法详解

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

尽管有查询字符串,但在使用 sql COUNT 时 ExecuteNonQuery 返回 -1

C# 中的事务和 ExecuteNonQuery 错误

使用 ExecuteNonQuery c# 时出错

错误 ExecuteNonQuery:连接属性尚未初始化 C# (Access)