【问题标题】:c# ExecuteNonQuery always returns Zeroc# ExecuteNonQuery 总是返回零
【发布时间】: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 条记录。那么为什么我没有得到正确的结果呢?..

【问题讨论】:

    标签: c# sql executenonquery


    【解决方案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 可能希望将结果集用于其他目的。
          猜你喜欢
          • 2011-12-09
          • 1970-01-01
          • 2013-04-17
          • 2011-12-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多