Рассмотрим выполнение запросов SELECT, INSERT, UPDATE и DELETE к базе данных Microsoft Access из программы на языке C#, на примере проекта Windows Forms в Visual Studio. В конце статьи вы найдете исходники, а также видеоурок по данной теме.
Проектирование базы данных MS Access
Создадим в Microsoft Access базу данных Workers (рабочие) с одной таблицей Worker (рабочий).
Таблица содержит следующие столбцы:
- w_id (идентификатор записи) — тип данных Счетчик;
- w_name (имя) — тип данных Короткий текст;
- w_position (должность) — тип данных Короткий текст;
- w_salary (зарплата) — тип данных Числовой.
Для корректной работы с базой данных MS Access с помощью языка C#, ее необходимо сохранить в формате с расширением .mdb
Создание проекта Windows Forms в Visual Studio на языке C#
Создадим проект Windows Forms на C# и поместим на форму следующие компоненты:
TextBox, ListBox и пять кнопок Button.
На макете формы в Visual Studio выполним двойные щелчки левой кнопкой мыши на всех кнопках, создав тем самым обработчики событий нажатия для каждой кнопки.
1 2 3 4 5 |
// обработчик события нажатия кнопки SELECT1 private void selectButton1_Click(object sender, EventArgs e) { } |
Также в окне свойств формы с помощью двойного щелчка мыши создадим обработчик события FormClosing, выполняющегося при закрытии формы.
1 2 3 4 5 |
// обработчик события закрытия формы private void Form1_FormClosing(object sender, FormClosingEventArgs e) { } |
Файл с БД поместим в каталог \bin\Debug в папке с проектом.
Написание кода на C# для выполнения запросов к MS Access
Добавим в класс формы строковое поле string — строку подключения к БД. В строке подключения в значении параметра Data Source указывается путь к файлу с базой данных.
1 2 3 4 5 |
// строка подключения к MS Access // вариант 1 public static string connectString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Workers.mdb;"; // вариант 2 //public static string connectString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Workers.mdb;"; |
Есть два варианта строки с различными провайдерами подключения. Если с первой строкой программа не будет работать — закомментируйте ее, а вторую раскомментируйте.
Далее добавим поле класса типа OleDbConnection. Экземпляр данного класса понадобится для установления соединения с базой данных MS Access.
1 2 |
// поле - ссылка на экземпляр класса OleDbConnection для соединения с БД private OleDbConnection myConnection; |
В конструкторе класса создадим экземпляр OleDbConnection и установим соединение с БД. Т.е. при запуске программы будет устанавливаться соединение с Access.
1 2 3 4 5 6 7 8 9 10 11 |
// конструктор класса формы public Form1() { InitializeComponent(); // создаем экземпляр класса OleDbConnection myConnection = new OleDbConnection(connectString); // открываем соединение с БД myConnection.Open(); } |
В обработчике события закрытия формы добавим код, закрывающий соединение с базой данных. Таким образом при выходе из программы соединение с БД будет закрываться.
1 2 3 4 5 6 |
// обработчик события закрытия формы private void Form1_FormClosing(object sender, FormClosingEventArgs e) { // заркываем соединение с БД myConnection.Close(); } |
Напишем в обработчик события нажатия кнопки SELECT1 код, выполняющий запрос выборки данных одного столбца одной строки. Вывод данных производится в TextBox.
1 2 3 4 5 6 7 8 9 10 11 12 |
// обработчик события нажатия кнопки SELECT1 private void selectButton1_Click(object sender, EventArgs e) { // текст запроса string query = "SELECT w_name FROM Worker WHERE w_id = 1"; // создаем объект OleDbCommand для выполнения запроса к БД MS Access OleDbCommand command = new OleDbCommand(query, myConnection); // выполняем запрос и выводим результат в textBox1 textBox1.Text = command.ExecuteScalar().ToString(); } |
При нажатии кнопки SELECT2 будет выполняться запрос на получение многострочных данных из нескольких столбцов (по сути таблицы). Данные выводятся в ListBox.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// обработчик события нажатия кнопки SELECT2 private void selectButton2_Click(object sender, EventArgs e) { // текст запроса string query = "SELECT w_name, w_position, w_salary FROM Worker ORDER BY w_salary"; // создаем объект OleDbCommand для выполнения запроса к БД MS Access OleDbCommand command = new OleDbCommand(query, myConnection); // получаем объект OleDbDataReader для чтения табличного результата запроса SELECT OleDbDataReader reader = command.ExecuteReader(); // очищаем listBox1 listBox1.Items.Clear(); // в цикле построчно читаем ответ от БД while(reader.Read()) { // выводим данные столбцов текущей строки в listBox1 listBox1.Items.Add(reader[0].ToString() + " " + reader[1].ToString() + " " + reader[2].ToString() + " "); } // закрываем OleDbDataReader reader.Close(); } |
Далее запрос вставки данных (INSERT) в MS Access на C#:
1 2 3 4 5 6 7 8 9 10 11 12 |
// обработчик события нажатия кнопки INSERT private void insertButton_Click(object sender, EventArgs e) { // текст запроса string query = "INSERT INTO Worker (w_name, w_position, w_salary) VALUES ('Михаил', 'Водитель', 20000)"; // создаем объект OleDbCommand для выполнения запроса к БД MS Access OleDbCommand command = new OleDbCommand(query, myConnection); // выполняем запрос к MS Access command.ExecuteNonQuery(); } |
Метод ExecuteNonQuery() класса OleDbCommand выполняет запрос и возвращает целое число типа int — количество строк затронутых выполняемым запросом. Данный метод подходит для запросов вставки INSERT, обновления UPDATE и удаления DELETE. Т.е. для тех, которые не возвращают данные.
Запрос обновления данных UPDATE:
1 2 3 4 5 6 7 8 9 10 11 12 |
// обработчик события нажатия кнопки UPDATE private void updateButton_Click(object sender, EventArgs e) { // текст запроса string query = "UPDATE Worker SET w_salary = 123456 WHERE w_id = 3"; // создаем объект OleDbCommand для выполнения запроса к БД MS Access OleDbCommand command = new OleDbCommand(query, myConnection); // выполняем запрос к MS Access command.ExecuteNonQuery(); } |
Пример SQL-запроса удаления данных (DELETE) из БД Access с помощью языка C#:
1 2 3 4 5 6 7 8 9 10 11 12 |
// обработчик события нажатия кнопки DELETE private void deleteButton_Click(object sender, EventArgs e) { // текст запроса string query = "DELETE FROM Worker WHERE w_id < 3"; // создаем объект OleDbCommand для выполнения запроса к БД MS Access OleDbCommand command = new OleDbCommand(query, myConnection); // выполняем запрос к MS Access command.ExecuteNonQuery(); } |
Скачать исходник программы из данного урока можно, нажав на кнопку ниже. Программа написана в среде разработки Visual Studio.
Скачать исходник
Более подробное объяснение темы выполнения запросов из программы на C# к базе данных Microsoft Access доступно в видеоуроке, представленном ниже.
Видеоурок по теме работы с БД MS Access из программы на языке C#
Поделиться в соц. сетях:
Здравствуйте! Ваше видео мне очень помогло разобраться в некоторых вещах, спасибо большое!
Не могли бы вы подсказать такую вещь — у меня есть текстбокс из которого я беру значение и использую это значение в запросе
Пример:
private void btn_cl_del_Click(object sender, EventArgs e)
{
string query = «DELETE FROM Clients WHERE ID='»+textbox+»‘»;
OleDbCommand command = new OleDbCommand(query, myConnection);
command.ExecuteNonQuery();
Проблема в том, что различается тип данных. Хоть в текстбокс и вводятся цифры, система воспринимает их как текст и поэтому не может произвести поиск по БД, чтобы выполнить запрос
Скажите, как с этим бороться?
Здравствуйте! Чтобы получить значение из текстового поля, используйте: textbox.Text
Здравствуйте! а что делать в случае если у меня 4 связанных таблицы? как сделать так чтобы с помощью запросов все они обрабатывались и были задействованы
Здравствуйте! Нужно использовать запросы JOIN.
Здравствуйте! Спасибо большое за видео, но есть один вопросик. Допустим есть таблица с полями Name (длинный текст) и Id ( короткий текст). Одну линейку из бд мы удаляем с помощью DELETE. У нас пускай были айди 1 2 3 4 5. Удалили третий. Теперь у нас 1 2 4 5. Как их обновить. Пробовал через UPDATE, но он разом проходит по всем линейкам БД. Таким образом получаем 1 1 1 1. Как решить эту проблему?
Здравствуйте! Когда выполняете запрос UPDATE нужно с помощью ключевого слова where указать к какой строке относится запрос (UPDATE TableName SET Id = 3 where Id = 4). А без where запрос изменит все строки в таблице.