【问题标题】:How can I figure out the number of rows a Database has using MySqlDataReader?如何使用 MySqlDataReader 计算数据库的行数?
【发布时间】:2020-07-29 13:46:36
【问题描述】:

我试图弄清楚如何查询 MySql 数据库的行数以及数据库中的每一行我想将一个整数添加到 ID 列表中。当我知道我有更多的行时,当我运行此代码时,我只返回 1 行,我不知道如何很好地使用 DataReader 关于如何简单地计算出数据库中的行数的任何建议将不胜感激。

    MySqlConnection Conn = new MySqlConnection(myConnectionString);
    MySqlDataReader mdr;
    public static List<int> AppointmentIDList = new List<int>();

    public void FillList()
    {
        Conn.Open();
        string Query = "SELECT * FROM U05lUM.appointment;";
        MySqlCommand command = new MySqlCommand(Query, Conn);
        mdr = command.ExecuteReader();
        if (mdr.Read())
        {
            if (mdr.HasRows)
            {
                foreach(int id in mdr.GetInt32("appointmentId").ToString())
                {

                    AppointmentIDList.Add(id);

                }
            }
        }
    }

【问题讨论】:

    标签: c# mysql database winforms


    【解决方案1】:

    您可以使用其他查询。查询可能是

    MySqlCommand command = new MySqlCommand("Select Count(*) FROM U05lUM.appointment;", Conn);
    Conn.Open()
    int rows = Convert.ToInt32(cmd.ExecuteScalar())
    Conn.Close();
    

    这将返回“U05lUM.appointment”数据库中的行数。如果您想进一步计数,还可以使用一些“WHERE”语句。

    【讨论】:

      【解决方案2】:

      您只读取了结果集中的一行。

      代替

      if (mdr.Read())
      

      你应该使用

      while (mdr.Read())
      

      您应该将 SQL 更改为 SELECT appointmentId FROM U05lUM.appointment;。当您只需要单列时,从表中读取所有列(带有SELECT *)既浪费又慢。

      mdr.HasRowsif (mdr.Read())while (mdr.Read()) 块内始终为真。你只是读了一行,所以结果集肯定有行。

      你的foreach(int id in mdr.GetInt32("appointmentId").ToString()) 没有做你想做的事。它为您从约会Id 创建的字符串中的每个字符生成一个值。

      而且,名为mdrSqlDataReader 对象在使用后需要清理(Disposed)。 using(){} 会自动发生这种情况。

      所以我建议这个代码。

          ...
          string Query = "SELECT appointmentId FROM U05lUM.appointment;";
          MySqlCommand command = new MySqlCommand(Query, Conn);
          using (SqlDataReader resultSet = command.ExecuteReader()) 
          {
              while (resultSet.Read())
              {
                  int id = resultSet.GetInt32("appointmentId")
                  AppointmentIDList.Add(id);
              }
          }
      

      如果您的表很大,这不会很快,因为您的查询必须扫描表的每一行。 SQL 的全部意义在于让您处理比 RAM 大几个数量级的数据集。您应该考虑设计您的程序,使其不必读取每一行,除非绝对必要。

      如果您想要的只是行数的精确计数,您可以使用 COUNT(*) 。这可以让您计算表中的行数

          ...
          int rowCount;
          string Query = "SELECT COUNT(*) rowCount FROM U05lUM.appointment;";
          MySqlCommand command = new MySqlCommand(Query, Conn);
          using (SqlDataReader resultSet = command.ExecuteReader()) 
          {
              if (resultSet.Read())   // THIS result set has only one row.
              {
                  rowCount = resultSet.GetInt32("rowCount")
              }
          }
      

      您的 DBMS 在处理 COUNT(*) 方面非常聪明。 MAX(appointmentId) 也可能有效。如果表中缺少一些 appointmentId 值,则它可能与行数不同。如果删除了某些行,可能会发生这种情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多