c#ExecuteOnQuery始终返回零

c#ExecuteOnQuery始终返回零,c#,sql,executenonquery,C#,Sql,Executenonquery,我认为连接没有问题,因为当我打开它时,它不会抛出任何错误。所以我猜错误是在执行命令时。这是我的代码: OleDbCommand cmd = new OleDbCommand("SELECT * FROM cars", conn); cmd.CommandType = CommandType.Text; int numbers = cmd.ExecuteNonQuery(); 我尝试使用消息框显示数字的值,但结果总是0。表cars包含5条记录。那么,为什么我没有得到正确的结果呢?。尝试使用Exe

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

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

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

尝试使用ExecuteScalar,它应该会给出计数。ExecuteOnQuery不会返回查询结果。查看的返回值指示受语句影响的行数,在您的情况下为零。

对于匿名downvoter,OP的关键部分:

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

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

我的答案:

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

"SELECT COUNT(*) FROM cars"
ExecuteOnQuery实际上并不期望返回任何结果。(通常使用ExecuteOnQuery运行insert、update和delete操作。)您应该使用需要单值结果(如count(*)的

现在大家一起:

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

因为您正在执行查询,并且ExecuteOnQuery返回受影响的行数,当您选择时,该行数始终为0,因为您没有更改任何内容(即插入、更新或删除)

ExecuteOnQuery
仅返回受更新、删除或插入操作影响的行数。有关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++;
}

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

对于他显示的select*查询,ExecuteCalar没有帮助。酷!美好的虽然还不能接受,但它告诉我“你可以在6分钟后接受答案”。呵呵,谢谢你!但是我如何才能获得不同的字段,例如id、名称等?@DavidePiras:如果仔细阅读这个问题,你会发现这个查询是不正确的。OP正在尝试获取聚合。。。表中记录的计数。不,因为问题不清楚,他提到了数字,但没有清楚地汇总。。。戴维德皮拉斯:不,这个问题并不明确,但其含义是明确的。OP希望返回一个数字。表中的项目数。未使用这些术语,但它是一个标量聚合值。count(*)是一个聚合函数。但是如果他需要一个count,那么这就太糟糕了。应该在SQL中计数,而不是在客户端循环所有记录!同意,计数更好,尽管我假设OP可能希望将结果集用于其他目的。