c# - 如何使用 MySqlDataReader 计算数据库的行数?

标签 c# mysql database winforms

我试图弄清楚如何查询 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);

                }
            }
        }
    }

最佳答案

您仅读取结果集中的一行。

而不是

if (mdr.Read())

你应该使用

while (mdr.Read())

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

mdr.HasRows if (mdr.Read())内永远都是真实的或while (mdr.Read()) block 。您刚刚读取了一行,因此结果集肯定有行。

您的foreach(int id in mdr.GetInt32("appointmentId").ToString())不做你想做的事。它为您根据appointmentId 创建的字符串中的每个字符生成一个值。

而且,SqlDataReader名为 mdr 的对象使用后需要清理(Dispose d)。 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,它可能与行数不同。表中的值。如果删除某些行,则可能会发生这种情况。

关于c# - 如何使用 MySqlDataReader 计算数据库的行数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61248233/

相关文章:

mysql - 如何从一个表中删除计数小于?

database - MySQL查询不返回任何数据

SQL 脚本不创建表

c# - 跨请求持久声明

c# - 如何填充 DockPanel?

java - mysql workbench 中的奇怪密码类型

php - 是否有具有连接接口(interface)的 mySQL 前端?

C# 重载无效参数

c# - 在 DLL 中编译类并在 C# 中的另一个项目中引用它

java - 如何处理应用程序运行时数据库关闭时发生的 MySQL CommunicationException