Запросы на выборку из таблицы, создаваемые в режиме проектирования
Адаптер, который был автоматически создан в нашем проекте, по умолчанию настроен на перенос из исходной базы данных в DataSet всей таблицы целиком. Мы можем изменить эту ситуацию, заставив его переносить из базы данных в DataSet не всю таблицу, а только часть ее, согласно созданному нами оператору SELECT. Это и будет решением задачи на выборку из базы данных. Решать ее можно вручную, в режиме проектирования. Можно и программным способом, в режиме работы, то есть не останавливая проекта для создания нового запроса на выборку. В этом подразделе мы рассмотрим создание запроса на выборку в режиме проектирования.
Создадим еще раз проект из 24.5.1. Создавать его будем в точности так же, как и тогда, но с одним отличием. Начните, как и раньше, соединив среду VS с базой данных «Контакт» при помощи Server Explorer и перетащив мышкой значок таблицы «Книги» из окна Server Explorer на форму вашего проекта, вследствие чего под формой появятся значки OleDbConnection1 и OleDbDataAdapter1.
Дальше начинаются отличия. Мы будем адаптер настраивать. Щелкните правой клавишей мыши по значку адаптера под формой и в контекстном меню выберите Configure Data Adapter. Вы увидите окно мастера настройки адаптера (Рис. 24.29).
Рис. 24.29
Нажмите Next в этом окне и в следующих двух окнах тоже, пока не появится окно создания оператора SQL (Рис. 24.30).
Рис. 24.30
В белом поле мы видим оператор SELECT, которым будет руководствоваться адаптер, выбирая данные из таблицы. Так вот кто виноват в том, что порядок полей был перепутан! Вручную подредактируйте этот оператор, чтобы порядок полей был удобным для вас:
SELECT Код, Avtor, Nazvanie, Data, Kol_str FROM Книги
Вы можете выкинуть некоторые поля, но не выкидывайте ключевое поле.
Нажмите Next, а в следующем окне – Finish. Адаптер настроен. Дальше продолжайте, как раньше: создавайте DataSet и DataGrid, пока проект с двумя кнопками не будет создан и запущен.
Обратите внимание, что SQL-оператор записан в одну строку, а не в несколько, как на Рис. 24.19. Это допустимо.
Вы уже догадались, что в белом поле вы можете написать какой угодно оператор SELECT, после чего будете наблюдать в сетке DataGrid нужную вам выборку. Для этого достаточно снова запустить мастер настройки адаптера и переписать оператор.
В процессе создания запроса на выборку вы можете нажать кнопку Query Builder (Рис. 24.19), после чего увидите очень удобное и привычное вам окно (Рис. 24.31), которое поможет вам сконструировать запрос, не затрудняясь написанием SQL-оператора.
Рис. 24.31
Задача создания выборки решена. Однако, если вы в процессе работы с приложением выполняете несколько выборок с разными условиями выбора, вам вряд ли захочется каждый раз прерывать работу проекта для того, чтобы в режиме проектирования заново настроить адаптер. К тому же, если вы создаете независимое приложение Windows, то оно обязано работать без запуска среды VS, а значит режим проектирования в этом случае просто недоступен.
Создадим проект, который выглядит так, как на Рис. 24.32.
Рис. 24.32
Сверху мы видим привычные нам две кнопки и таблицу, целиком загруженную из базы данных в сетку DataGrid1 при помощи верхней кнопки. В этой сетке мы вручную изменяем данные, удаляем и добавляем строки и сохраняем эти изменения в исходной базе при помощи второй кнопки.
Ниже мы видим кнопку, текстовое поле и еще одну сетку – DataGrid2. В текстовом поле мы пишем SQL-запрос на выборку, после чего нажимаем кнопку и в сетке DataGrid2 наблюдаем результаты запроса.
Начнем создавать проект. Верхняя часть его создается абсолютно так же, как в 24.5.1, но не забудьте переставить поля в адаптере и задать ширину и названия столбцов сетки.
Проверив в работе верхнюю часть проекта, приступим к созданию нижней, поместив на форму кнопку, текстовое поле и еще одну сетку. А теперь еще раз перетащим мышкой значок таблицы «Книги» из окна Server Explorer на форму вашего проекта. Вы увидите, что в ваш проект добавился еще один значок адаптера – OleDbDataAdapter2. Таким образом, данные из одной таблицы можно перекачивать в проект несколькими адаптерами, настроив каждый по-своему. Но нам нет нужды как-то его особенно настраивать. Задайте ему тот же порядок полей, что и у адаптера OleDbDataAdapter1.
А теперь пора для нового адаптера создавать DataSet. Щелкните правой клавишей мыши по форме и в контекстном меню выберите Generate Dataset. Вы увидите диалоговое окно. Настройте его, как показано на Рис. 24.33.
Рис. 24.33
Как видите, мы выбрали создание нового объекта DataSet2, включающего в себя таблицу «Книги», поставляемую адаптером OleDbDataAdapter2 (но не адаптером OleDbDataAdapter1).
Щелкните ОК. Вы увидите, что в ваш проект добавился еще один значок – DataSet21. Установим значение свойства DataSource второй сетки в DataSet21.Книги. Теперь DataGrid2 будет автоматически отражать содержимое таблицы Книги, поставляемое в DataSet2 адаптером OleDbDataAdapter2. Не перепутайте все эти единицы и двойки.
Для задания названий и ширины столбцов второй сетки напишите код, аналогичный коду, написанному для первой.
Для обеспечения работы нижней части проекта достаточно написать короткую процедуру обработки нажатия на третью кнопку:
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
DataSet21.Книги.Clear()
Dim Команда As New OleDb.OleDbCommand(TextBox1.Text, OleDbConnection1)
OleDbDataAdapter2.SelectCommand = Команда
OleDbDataAdapter2.Fill(DataSet21)
End Sub
Пояснения: Первая строка процедуры очищает DataSet2 (а значит и DataGrid2) от прошлых данных, освобождая место для данных требуемой выборки.
Вторая строка создает объект Команда класса OleDbCommand. Это не что иное, как команда на выполнение некоторого действия над базой данных. Первый параметр конструктора (TextBox1.Text) указывает, откуда брать текст команды (у нас это SQL-оператор, заранее записанный нами в текстовом поле TextBox1). Второй параметр конструктора (OleDbConnection1) указывает, куда направлять команду, чтобы она делала там свое дело.
Третья строка процедуры указывает уже персонально адаптеру, какой командой (Команда) ему пользоваться для выборки (SelectCommand) данных из исходной базы данных.
Настроенный таким образом адаптер в четвертой строке заполняет DataSet2 из базы данных.
Запустите проект. Введите текст SQL-оператора в текстовое поле, нажмите кнопку и наблюдайте результаты запроса. Чуть измените оператор, снова нажмите кнопку и снова наблюдайте результаты запроса. И так далее. Проект готов.
Вам может показаться не очень «круто» – заставлять пользователя самому записывать текст SQL-оператора. Ну что ж, вы можете поступить, как поступили создатели Access или Excel, или хотя бы Query Builder (см. Рис. 24.31), которые предлагают пользователю выбирать параметры выборки из разворачивающихся списков или записывать простейшие логические выражения фильтрации. Вы тоже можете организовать массивы списков и маленьких текстовых полей по числу столбцов таблицы. Вам останется только сконструировать согласно выбору пользователя текст SQL-оператора, как это делает Query Builder.
Еще об SQL. Следующая таблица иллюстрирует некоторые необязательные, но удобные возможности оператора SELECT:
Оператор |
Смысл |
SELECT * FROM Книги |
На экран выводится вся таблица. Звездочку пишут для сокращения, чтобы не перечислять все поля. |
SELECT TOP 3 * FROM Книги ORDER BY Kol_str DESC |
На экран выводятся 3 самые толстые книжки, выпущенные издательством. Выражение ORDER BY Kol_str DESC сортирует записи по убыванию числа страниц, а выражение TOP 3 показывает на экране только верхние 3 записи из отсортированных. |
SELECT * FROM Книги WHERE Kol_str BETWEEN 100 AND 200 |
На экран выводятся книжки с числом страниц МЕЖДУ 100 И 200. |