Использование SqlDataReader для заполнения List <T>в c # - PullRequest
1 голос
/ 11 ноября 2011

У меня есть класс, как показано ниже,

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

И у меня есть таблица MySql с 50000 записей.Структура таблицы выглядит следующим образом:

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);

Он работает очень хорошо, и скорость очень нормальная,Но в чем проблема, я пробую это с моими собственными классами?

Ответы [ 2 ]

5 голосов
/ 11 ноября 2011

Если код выполняется медленно, основной причиной является наличие 50000 записей. Что именно вам нужно с 50000 Student объектами? Если вы сможете найти способ решить вашу проблему, не читая все эти записи и не создавая все эти объекты, у вас будет более быстрый код.

Обновление

Хорошо использовать свой собственный класс. В большинстве случаев, когда дела идут медленно, это происходит потому, что ваш код привязан к вводу / выводу (вы проводите большую часть времени в ожидании ввода / вывода). Чтобы избежать всего этого ввода-вывода, вы можете уменьшить объем данных, которые вы извлекаете (возможно, удаляя ненужные столбцы или строки из ваших данных) или выполняя обработку в базе данных с помощью более сложного запроса или хранимой процедуры.

Обновление 2

Чтобы ответить на ваш дополнительный вопрос (почему создание списка объектов медленнее, чем получение DataSet), я ожидаю, что чтение всего запроса как DataSet будет только немного быстрее, чем создание объекта. Я не знаком с тем, как реализована эта библиотека MySQL .NET. Меня удивляет, что эти два метода имеют большую разницу в скорости . Возможно, MySqlDataReader делает что-то глупое, как использование внутреннего DataSet. Если производительность этих двух систем существенно отличается, вероятно, это то, что автор этой библиотеки должен исправить.

Обновление 3

Этот ответ для MySqlDataAdapter или MySqlDataReader для массовой передачи? имеет хороший совет; установка BatchSize считывателя может быть полезной. Если размер пакета слишком мал для читателя, это сделает его менее эффективным при большом количестве записей, подобных вашей.

1 голос
/ 11 ноября 2011

Использование индекса записи вместо 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...