使用SqlDataReader填充列表在c#

本文关键字:SqlDataReader 填充 列表 使用 | 更新日期: 2023-09-27 18:14:07

我有一个像下面这样的类,

class Student
{
    public string Name {get; set;}
    public string Surname {get; set;}
    public int Age {get; set;}
    public string Address {get; set;}
}

我有一个有50,000条记录的MySql表。表的结构如下:

ID        NAME       SURNAME        AGE          ADDRESS
1         Joe        Philip         20           Moscow
2         Misha      Johny          25           London
...

我有一个c#代码

List<Student> students = new List<Student>();
string sql = "SELECT name,surname,age,address FROM Students";
command.CommandText = sql;
MySqlDataReader reader = command.ExecuteReader();
while(reader.Read())
{
    Student st = new Student();
    st.Name = reader["Name"].ToString();
    st.Surname = reader["Surname"].ToString();
    st.Age = Convert.ToInt32(reader["Age"].ToString());
    st.Address = reader["Address"].ToString();
    students.Add(st);
}

但是它工作很慢。您建议使用哪种方法使代码运行得更快?

更新:

当我使用这段代码时,

DataTable dt = new DataTable();
adapter.Fill(dt);

它工作得很好,速度很正常。但问题是什么,我尝试与自己的类?

使用SqlDataReader填充列表<T>在c#

如果代码运行缓慢,最大的原因是有50,000条记录。对于50,000个Student对象,您需要做什么?如果你能找到一种方法来解决你的问题,而不需要读取所有这些记录和创建所有这些对象,你就会有更快的代码。

使用自己的类是可以的。大多数情况下,当程序运行缓慢时,这是因为您的代码是I/O绑定(您花费了大部分时间等待I/O)。为了避免所有这些I/O,您可以减少检索的数据量(可能通过从数据中删除不相关的列或行),或者通过更复杂的查询或存储过程在数据库上进行处理。

更新2

要回答您的后续问题(为什么创建对象列表比获得DataSet慢),我希望将整个查询读取为DataSet只会比对象创建快一点。我不熟悉MySQL . net库是如何实现的。令我惊讶的是,这两种方法在速度上会有很大的差异。也许MySqlDataReader正在做一些愚蠢的事情,比如使用内部DataSet。如果两者之间的性能有很大的不同,那么这个库的作者可能应该修复这个问题。

更新3

这个答案为MySqlDataAdapter或MySqlDataReader批量传输?有一个很好的提示;设置阅读器的BatchSize可能会有所帮助。如果批处理大小对于阅读器来说太小,那么对于像您这样的大量记录,它的效率会降低。

使用index of record而不是coulmname可以使性能更好一些使用

st.Name = reader[0].ToString();
instead of
st.Name = reader["Name"].ToString();
and 
st.Name = reader[0].ToString();
instead of 
st.Name = reader["surname"].ToString();