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