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呢