• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Статья Получение данных из базы данных Mysql с помощью метода ExecuteReader

Mysql метод ExecuteReader
В этой статье хочу показать на простом примере, как можно получить данные из базы данных Mysql с помощью метода ExecuteReader.

И так предположим, что у нас есть база данных notebook, которая содержит всего одну таблицу Friends. Данная таблица состоит из трёх столбов: id, name, age и уже содержит несколько записей.

29792


В качестве задачи рассмотрим, как с помощью метода ExecuteReader получить все значения из колонки name в таблице Friends и вывести полученный результат в элемент управления TextBox.

Подготовка
1. Создадим новый проект типа Windows Forms Application

2. Добавим на форму: кнопку и текстовое поле (textbox).

29793


3. Для поля textBox установим свойство Multiline в значение true.
29794


4. Для работы с базой данных Mysql потребуется установить MySQL Connector.

5. Создадим новый метод GetAllNames, с помощью которого мы получим все имена, которые содержаться в колонке Name таблицы Friends.
C#:
private string GetAllNames()
{
}


6. Добавим в тело метода следующий код:
C#:
private string GetAllNames()
{
StringBuilder sb = new StringBuilder();
MySqlConnectionStringBuilder mysqlCSB;
mysqlCSB = new MySqlConnectionStringBuilder();
mysqlCSB.Server = "127.0.0.1";
mysqlCSB.Database = "notebook";
mysqlCSB.UserID = "admin";
mysqlCSB.Password = "123";
string queryString = "SELECT name FROM Friends";
try
{
using (MySqlConnection con = new MySqlConnection())
{
con.ConnectionString = mysqlCSB.ConnectionString;
con.Open();
using(MySqlCommand com = new MySqlCommand(queryString,con))
{
using (MySqlDataReader rd = com.ExecuteReader())
{
while (rd.Read())
{
sb.AppendLine(rd.GetString("Name"));
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return sb.ToString();
}


7. На форме выберите кнопку и подпишитесь на событие Click. В обработчике события Button_Click поместите код для вызова метода GetAllNames и вывода данных в текстовое поле:
C#:
private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = GetAllNames();
}


результат

29795


В принципе значение Multiline можно не менять, тогда вместо метода AppendLine используйте метод Append (sb.Append).

Более подробно о том, как работать с базой данных Mysql, можно прочитать, перейдя по ссылке. В этой же статье мы более подробно рассмотрим лишь только ту часть кода, которая отвечает за получение данных из базы данных Mysql и вывод.

Работа метода ExecuteReader
За получение данных из базы данных Mysql отвечает следующая часть кода:
C#:
using (MySqlDataReader rd = com.ExecuteReader())
{
while (rd.Read())
{
}
}


В первой строке кода с помощью метода ExecuteReader создаётся новый объект типа MySqlDataReader и происходит отправка запроса к базе данных Mysql.

Обычно результат запроса возвращается в объект MySqlDataReader. В данном примере в качестве результата запроса мы получаем таблицу, состоящую из одного колонки Name.

29796


Так как мы создали новый объект на основе метода ExecuteReader, то в результате мы получили возможность только читать данные из полученной таблицы результатов.

Обратите внимание на то, что чтение строк выполняется только при установленном соединении с базой данных Mysql и только в прямом направлении (то есть по порядку сверху вниз) это значит, что произвольно перемещаться по таблице вы не можете.

Как происходит чтение данных?
Объект MySqlDataReader содержит метод Read, который позволяет нам управлять курсором, который в свою очередь позволяет перемещаться по таблице результатов (сверху вниз).

По умолчанию курсор установлен перед самой первой записью в таблице.

29797


Во время выполнения цикла курсор опускается по порядку к каждой записи в таблице, в результате этого, поочередно, каждая строка становиться выбранной, и мы получаем возможность прочитать и получить из неё интересующие нас данные.

29798


Чтобы получить значение из выбранной строки вы должны указать либо индекс интересующего вас столбца или его имя, например, получить имя друга можно двумя способами:
C#:
while (rd.Read())
{
//ноль - это индекс колонки Name
textBox.Text = rd[0].ToString();
//textBox.Text = rd["Name"];
}
В обоих случаях мы получим одинаковый результат.

Для увеличения производительности операции связанные с чтением рекомендуется использоваться специальные типизированные методы, например такие как: GetInt16, GetInt32, GetString и другие, например:

C#:
textBox1.Text = rd.GetString("Name");
Так же в данный момент Вы можете использовать свойство FieldCount, которое позволяет определить количество полей в выбранной строке, например:

C#:
while (rd.Read())
{
int cntFlds = rd.FieldCount; //1
}
Получили единицу, потому что в нашей результирующей таблице содержится только одно поле Name.

Если мы изменим sql запрос:
C#:
string queryString = "SELECT * FROM friends";
Результат: 3

Но, не стоит забывать, что при обращении к колонке нужно указать её индекс. Для первой колонки он всегда равен нулю, а для последней будет равен (общее количество столбцов — 1).

После получения последней записи процесс чтения данных завершается. Теперь Вы должны закрыть объект MySqlDataReader с помощью метода Close, например:
C#:
MySqlDataReader rd = com.ExecuteReader();
while (rd.Read())
{
//какие-то действия
}
rd.Close();
Но, так как MySqlDataReader реализует интерфейс IDisposable и у него есть метод Dispose, то мы можем использовать using для того, чтобы автоматически закрыть объект чтения и затем удалить его, как например, в нашем основном примере.

Все полученные данные из таблицы мы помещаем в объект типа StringBuilder — это позволяет экономично работать с память при работе со строками.
 

Сергей Попов

Кодебай
30.12.2015
4 693
6 588
BIT
345
ДМИТРИЙ
08.01.2016 в 18:52
Здравствуйте!

Подскажите, пожалуйста, мне нужно из базы данных получить список станций и поместить их в список (List).

По аналогии с вышеуказанным примером пробую сделать следующее:
Код:
string conString = "Database='base_test';  Network Address='localhost'; User Name='test'; Password='1';"
private List stations()
{
List names = new List();
string queryString = "SELECT ds.name FROM dirstation ds
JOIN directions d ON ds.id_direction=d.id_direction
WHERE d.name='" + PrigDirNameCurrent.Text + "'
ORDER BY id_st ASC";
using (MySqlConnection con = new MySqlConnection())
{
con.ConnectionString = conString;
MySqlCommand com = new MySqlCommand(queryString, con);
try
{
con.Open();
using (MySqlDataReader dr = com.ExecuteReader())
{
while (dr.Read())
{
names.Add(dr.GetString("name"));
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
return names;
}
Но при прогоне с помощью дебаггера у меня внутрь цикла while программа не заходит, хотя таблицы в БД точно не пустые.
Подскажите, пожалуйста, верен ли ход мысли и если да, то в чём может быть загвоздка в while?

ADMIN
09.01.2016 в 16:36
Привет.
Код:
using (MySqlDataReader dr = com.ExecuteReader())
{
if (dr.HasRows)
{
//проверяем, есть строки или нет
}
Если в этот блок не попадаем, то строк – нет, а это значит, что-либо данных в указанной таблице — нет, либо sql запрос составлен неверно и его нужно проверить. Например, с помощью phpmyadmin или консоли выполнить его и посмотреть, что он вернёт.

ДМИТРИЙ
10.01.2016 в 12:29
Спасибо, попробую! А что касается списка — идея/реализация верная?

ADMIN
12.01.2016 в 00:48
А что здесь не так в плане идеи/реализации? Получили данные, заполнили список и передали его дальше. Довольно часто такое можно встретить.

ЭЛЬВИРА
12.01.2016 в 23:53
А можно ли как-то заменить названия столбцов. Т.е. в данном примере выводить не «Name», а «Имя». Или будет выводится только то, что заданно в БД?

ADMIN
14.01.2016 в 10:01
Код:
string sqlQuery = "select Name as 'Имя' from tblName"; 
string colName = dr.GetName(0);
//Имя 0 — индекс колонки
 
  • Нравится
Реакции: Night Hunter
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!