В предыдущей статье «Примеры SQL-запросов. Microsoft SQL Server и язык T-SQL» были представлены инструменты Microsoft Server 2012 для отработки запросов и выполнено сравнение с с их обработкой в консольном приложении. В данной статье представлены примеры задания и обработки запросов в диалоговом режиме с использованием той же базы данных Garage.
Постановка задачи
Требуется представить обработку запросов на удаление, обновление и вставку записей в оконном приложении и в режиме диалога.
Решение
Пользовательский интерфейс приложения представим в следующем виде:
Компонент listBox1 будем использовать для отображения результатов работы с БД (запросы или сообщения об ошибках. Элемент comboBox1 для выбора имени таблицы (Cars, Drivers, Routes). При нажатии кнопки «Показать содержимое» отображаются записи выбранной таблицы. Если имя таблицы не выбрано, отображается содержимое первой таблицы Cars.
Идентификатор записи задает значение ключевого поля выбранной таблицы. При нажатии кнопки «Удалить запись с ID» запись удаляется, если имеется запись с заданнымID. Ничего не происходит, если номер ID в соответствующей таблице отсутствует. При ошибке формата при задании ключевого поля выводится соответствующее сообщение.
Наиболее частой операцией в БД будет задание поля «работа/выходной». Используя кнопку «Обновить: работа/выходной» и задавая идентификатор записи в вышележащем окне мы можем внести соответствующие изменения.
Для вставки новой записи в таблицу Drivers необходимо задать идентификатор новой записи (при вводе уже существующего ID должно появиться сообщение об ошибке), Фамилию и имя водителя, выбрать режим его работы (радио-кнопками).
Аналогично выполняются действия по вставке записей в таблицы Cars и Routes. Ошибки ввода также должны обрабатываться.
Подключение к БД будет осуществляться также, как в предыдущем примере.
Программирование
Необходимые действия по подготовке подключения к БД выполним в конструкторе формы Form1( ).
Для отображения любой из трех таблиц в listBox1 зададим метод DBread4toListBox(string table), где table — имя таблицы (Cars, Drivers или Routes). Для выбора имени таблицы с помощью элемента comboBox1 зададим метод NameTableFromComboBox(). Аналогично для извлечения имени ключевого поля выбранной таблицы будем использовать метод GetID( ).
Шести кнопкам button1, …, button 6 (пронумерованы сверху вниз) соответствуют шесть обработчиков событий: Button1_Click( ), … , Button6_Click( ). Каждый из шести методов начинается с оператора cn.Open( ) и завершается оператором cn.Close( ), где cn определяет подключение к БД. Это означает, что подключение к БД осуществляется только для выполнения заданной операции, после чего сразу производится отключение. Помните, что что современные базы данных могут и должны работать одновременно с несколькими пользователями.
Для методов, связанных с удалением и вставкой записей для фильтрации возможных ошибок при задании параметров запросов используется конструкция try { } — catch { }.
Программный код модуляForm1.cs:
using System; using System.Configuration; using System.Data.Common; using System.Windows.Forms; namespace WinSQLcommand { public partial class Form1 : Form { DbConnection cn; // подключение DbCommand cmd; // инструкция SQL public Form1() { InitializeComponent(); // настройка подключения к БД DbProviderFactory df = DbProviderFactories.GetFactory(ConfigurationManager.AppSettings["provider"]); cn = df.CreateConnection(); cn.ConnectionString = ConfigurationManager.AppSettings["conStr"]; cmd = df.CreateCommand(); cmd.Connection = cn; } // Чтение table_4 в listBox1 private void DBread4toListBox(string table) { DbDataReader dr = cmd.ExecuteReader(); // для отображения данных listBox1.Items.Clear(); listBox1.Items.Add(table); while (dr.Read()) listBox1.Items.Add(" ID - " + dr[0].ToString() + " | " + dr[1].ToString() + " | " + dr[2].ToString() + " | " + dr[3].ToString()); } // выбор таблицы [0],[1],[2] из comboBox1 private string NameTableFromComboBox() { string table = comboBox1.Items[0].ToString(); if (comboBox1.SelectedIndex > -1) table = comboBox1.SelectedItem.ToString(); return table; } // имя ключевого поля (т.к. они разные) private string GetID() { int index = 0; if (comboBox1.SelectedIndex > 0) index = comboBox1.SelectedIndex; string keyID = ""; switch (index) { case 0: keyID = "IDcar="; break; case 1: keyID = "IDdr="; break; case 2: keyID = "IDrout="; break; default: break; } return keyID; } // Вывод cодержимого выбранной таблицы private void Button1_Click(object sender, EventArgs e) { // выбор таблицы [0],[1],[2] из comboBox1 string table = NameTableFromComboBox(); // запрос cmd.CommandText = "Select * From " + table; cn.Open(); // открыть подключение // считывание потока DBread4toListBox(table); cn.Close(); // закрыть подключение } // Удаление по ID записи private void Button2_Click(object sender, EventArgs e) { cn.Open(); try { string table = NameTableFromComboBox(); string keyID = GetID(); // запрос на удаление cmd.CommandText = "Delete From " + table + " Where " + keyID + textBox1.Text + ";"; DbDataReader dr = cmd.ExecuteReader(); listBox1.Items.Clear(); listBox1.Items.Add("Удаление выполнено"); } catch { listBox1.Items.Clear(); listBox1.Items.Add("Удаление не выполнено, ошибка формата при задании ID"); } cn.Close(); } // Обновление - работа/выходной private void Button3_Click(object sender, EventArgs e) { cn.Open(); try { string table = NameTableFromComboBox(); string keyID = GetID(); char w = '1'; if (radioButton2.Checked) w = '0'; // запрос на обновление: работа/выходной cmd.CommandText = "Update " + table + " Set Work = " + w + " Where " + keyID + textBox1.Text + ";"; DbDataReader dr = cmd.ExecuteReader(); listBox1.Items.Clear(); listBox1.Items.Add("Обновление выполнено"); } catch { listBox1.Items.Clear(); listBox1.Items.Add("Обновление не выполнено, ошибка формата "); } cn.Close(); } // Добавление (вставка) нового водителя private void Button4_Click(object sender, EventArgs e) { cn.Open(); try { string table = NameTableFromComboBox(); char w = '1'; if (radioButton2.Checked) w = '0'; cmd.CommandText = "Insert Into " + table + " (IDdr, Name, Rights, Work) Values ('" + textBox1.Text + "', N'" + textBox2.Text + "', '" + textBox3.Text + "', " + w + ");"; DbDataReader dr = cmd.ExecuteReader(); listBox1.Items.Clear(); listBox1.Items.Add("Вставка выполнена"); } catch { listBox1.Items.Clear(); listBox1.Items.Add("Вставка не выполнена. Вставка записи с уже имеющимся ID не возможна, либо ошибка формата "); } cn.Close(); } // Вставка нового автомобиля private void Button5_Click(object sender, EventArgs e) { cn.Open(); try { string table = "Cars"; cmd.CommandText = "Insert Into " + table + " (IDcar, Typecar, LICplate, Npass) Values ('" + textBox4.Text + "', '" + textBox5.Text + "', '" + textBox6.Text + "', " + textBox7.Text + ");"; DbDataReader dr = cmd.ExecuteReader(); listBox1.Items.Clear(); listBox1.Items.Add("Вставка выполнена"); } catch { listBox1.Items.Clear(); listBox1.Items.Add("Вставка не выполнена. Вставка записи с уже имеющимся ID не возможна, либо ошибка формата "); } cn.Close(); } // Вставка нового маршрута private void Button6_Click(object sender, EventArgs e) { cn.Open(); try { string table = "Routes"; cmd.CommandText = "Insert Into " + table + " (IDrout, Number, IDcar, IDdr) Values ('" + textBox8.Text + "', '" + textBox9.Text + "', '" + textBox10.Text + "', " + textBox11.Text + ");"; DbDataReader dr = cmd.ExecuteReader(); listBox1.Items.Clear(); listBox1.Items.Add("Вставка выполнена"); } catch { listBox1.Items.Clear(); listBox1.Items.Add("Вставка не выполнена. Вставка записи с уже имеющимся ID не возможна, либо ошибка формата "); } cn.Close(); } } }
Проверка
Стандартные действия по проверке результатов запросов:
1) просмотр содержимого выбранной таблицы (кнопка 1);
2) выполнение запроса (кнопки 2 — 6);
3) анализ результата;
4) контроль выполнения (снова кнопка 1).
Пожелание читателю
Сообщите в комментариях о возможных ошибках при выполнении запросов. Я просматриваю их ежедневно.
NEW: Наш Чат, в котором вы можете обсудить любые вопросы, идеи, поделиться опытом или связаться с администраторами.