使用SqlDataReader填充c#中的List
我有一个类如下,
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 students = new List(); 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
可能会有所帮助。 如果批量大小对于读者而言太小,那么使用像您这样的大量记录会降低其效率。
使用记录索引而不是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();