使用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);
它工作得很好,速度很正常。但问题是什么,我尝试与自己的类?
如果代码运行缓慢,最大的原因是有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();