Как связать форму с базой данных sql

от admin

Пример программы демонстрации основных операций над данными таблицы базы данных MS SQL Server ( SQLEXPRESS )

Разработать приложение, которое демонстрирует основные операции над данными в базе данных типа MS SQL Server , а именно:

  • подключение базы данных к приложению;
  • отображение таблиц базы данных на форме;
  • добавление новой записи в базу данных;
  • редактирование записи;
  • удаление записи.

За основу взята база данных Education.dbo , процесс создания которой подробно описывается здесь.

На рисунке 1 отображена структура базы данных Education.dbo . Как видно из рисунка, база данных называется:

Здесь « sasha-pc » – идентификатор компьютера в сети, « sqlexpress » – название сервера баз данных, « Education.dbo » – название базы данных.

Рис. 1. База данных Education.dbo

База данных содержит две таблицы: Student и Session. Структура таблиц следующая.

Таблица Student

Таблица Session

Выполнение

1. Создать новый проект в MS Visual Studio как Windows Forms Application .

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

2. Создание нового представления ( view ) для отображения данных таблицы Student .

Чтобы отображать данные таблиц базы данных, можно использовать разные способы. Один из них – это создание представлений ( views ), которые формируются средствами MS Visual Studio .

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

Для создания представления, нужно вызвать команду « Add New View » из контекстного меню, которое вызывается кликом правой кнопкой мышки на элементе « Views » базы данных Education.dbo (рисунок 2).

База данных SQL Server команда "Add New View"

Рис. 2. Вызов команды добавления нового представления

В результате откроется окно « Add Table » (рисунок 3). В окне нужно выбрать таблицы, которые добавляются к представлению.

SQL Server Выбор таблица команда Add Table

Рис. 3. Выбор таблиц, на которых будет базироваться новое представление

В нашем случае выбираем таблицу Student и подтверждаем свой выбор кликом на кнопке Add . Следующим шагом нужно закрыть окно выбором кнопки Close .

После выполненных действий будет сформировано окно, в котором нужно выбрать поля, которые должны отображаться в представлении (на форме). Выбираем все поля (рисунок 4).

При выборе полей, в верхней части рабочей области отображаются поля таблицы Student . С помощью «мышки» можно выбирать нужные поля для представления.

Соответственно, в средней области окна отображаются названия выбранных полей, таблица в которой они есть (см. рис. 4), возможность сортировки, фильтрование и прочее.

В нижней части области отображается соответствующий текст SQL -запроса, который используется для создания представления.

MS SQL Server Выбор полей таблица Student

Рис. 4. Выбор полей таблицы Student для их отображения в представлении

После выбора команды

откроется окно, в котором нужно указать имя представления. Задаем имя « View Student » (рисунок 5).

MS SQL Server Указание имени представление

Рис. 5. Указание имени для представления

После выполненных действий, окно представления будет иметь вид как показано на рисунке 6.

MS SQL Server Представление

Рис. 6. Представление View Student в базе данных

Теперь можно размещать элемент управления DataGridView и связывать его с представлением.

3. Размещение элемента управления DataGridView и настройка связи с базой данных.

Перед размещением элемента управления DataGridView нужно перейти в режим проектирования формы « Form1.cs [Design] «.

Элемент DataGridView представляет собой таблицу, которая может отображать данные. Данный элемент управления размещается в панели ToolBox . Сначала немного корректируем размеры формы, а потом размещаем на ней элемент управления DataGridView (рисунок 7). В результате будет создан экземпляр объекта с именем dataGridView1 по умолчанию.

SQL Server Элемент управления DataGridView окно выбора источника данных

Рис. 7. Элемент управления DataGridView и окно выбора источника данных

После размещения элемента управления типа DataGridView на форме в правом верхнем углу можно выбрать настройку источника данных. Соответственно откроется окно « DataGridView Tasks «. В этом окне нужно выбрать сплывающее меню « Choose Data Source «.

В открывшемся меню выбирается команда « Add Project Data Source… » (рис. 7). После этого открывается окно мастера, в котором последовательно выбирается источник данных.

На рисунке 8 показано окно « Data Source Configuration Wizard «, в котором выбирается тип источника данных. В нашем случае устанавливаем « Database «.

База данных MS SQL Server тип источника данных

Рис. 8. Выбор типа источника данных

В следующем окне (Рисунок 9) выбирается модель источника данных. Нужно выбрать DataSet .

MS SQL Server Выбор модели источника данных

Рис. 9. Выбор модели источника данных

В окне, изображенном на рисунке 10 , нужно задать соединение данных, которое нужно использовать для подключения к базе данных. В нашем случае нужно выбрать базу данных « sasha-pc\sqlexpress\Education.dbo «.

MS SQL Server соединение данных

Рис. 10. Выбор соединения данных

В следующем окне (рисунок 11) предлагается сохранить строку соединения Connection String в конфигурационный файл приложения. Оставляем все как есть и переходим к следующему окну.

Предложение сохранения Connection String конфигурационный файл

Рис. 11. Предложение сохранения строки соединения с базой данных Connection String в конфигурационном файле приложения

После создания соединения с базой данных отображается множество объектов базы данных (рисунок 12). В нашем случае нужно выбрать представление « View Student » и все поля из него. Отмеченные поля будут отображаться в компоненте типа DataGridView .

MS SQL Server объект база данных DataGridView

Рис. 12. Выбор объектов базы данных, которые нужно отображать в DataGridView

После выбора кнопки Finish будут отображены выбранные объекты (представление View Student ) базы данных Education.dbo (рисунок 13).

C# Windows Forms Application Элемент управления DataGridView

Рис. 13. Элемент управления типа DataGridView с выбранными полями представления View Student

Подобным образом можно настроить представления, которые содержат любые поля из любых таблиц базы данных. Также в одном представлении могут отображаться поля из разных таблиц.

4. Настройка вида элемента управления типа DataGridView .

Если запустить приложение на выполнение, то будут получены данные представления View Student , которое отвечает таблице Student базы данных (рисунок 14).

C# Шаблон Windows Forms Запуск приложение

Рис. 14. Запуск приложения на выполнение

Как видно из рисунка 14, данные в таблице dataGridView1 отображаются нормально, но оформление можно скорректировать.

Элемент управления типа DataGridView допускает корректирование вида полей, которые отображаются.

Для вызова команд редактирования полей, достаточно вызвать контекстное меню кликом правой кнопкой мышки на элементе управления dataGridView1 .

В меню существуют различные полезные команды, которые разрешают управлять видом и работой DataGridView :

  • команда блокирования элемента управления ( Lock Controls );
  • команда редактирования полей, которые отображаются в представлении ( Edit Columns… );
  • команда добавления новых полей, например вычисляемых ( Add Column ).

В нашем случае нужно выбрать команду « Edit Columns… » (рисунок 15).

MS SQL Server Команда "Edit Columns. "

Рис. 15. Команда « Edit Columns… » из контекстного меню

В результате откроется окно « Edit Columns «, в котором можно настроить вид полей представления по собственному вкусу (рисунок 16).

MS SQL Server Окно настройки вида полей "View Student"

Рис. 16. Окно настройки вида полей в представлении « View Student «

В окне на рисунке 16 для любого поля можно настроить название, выравнивание, ширину, возможность редактирования данных и т.п.

5. Строка Connection String

Для того, чтобы в базу данных вносить изменения, нужно получить строку соединения с базой данных Connection String .

Существуют разные способы получения строки соединения с базой данных. Один из них базируется на чтении этой строки в окне Properties базы данных Education.dbo (рис. 17).

C# Windows Forms Определение строки Connection String

Рис. 17. Определение строки Connection String

Для сохранности строки в программе вводится внутренняя переменная типа string . С помощью буфера обмена копируем строку Connection String в описанную переменную типа string .

В тексте файла « Form1.cs » в начале описания класса Form1 надо описать переменную:

На данный момент текст класса Form1 следующий:

6. Создание новой формы для демонстрации команд манипулирования данными.

Для того, чтобы иметь возможность обрабатывать данные текущей записи нужно создать новую форму. Процесс создания новой формы в MS Visual Studio — C# подробно описывается здесь .

Добавление новой формы осуществляется командой:

В открывшемся окне « New Item » нужно выбрать элемент « Windows Form «.

Имя файла новой формы оставляем по умолчанию « Form2.cs «.

На рисунке 18 изображен вид новой формы.

Размещаем на форме элементы управления следующих типов:

  • два элемента управления типа Button (кнопки OK и Cancel ). Соответственно будет получено два объекта с именами button1 и button2 ;
  • четыре элемента управления типа Label для создания информационных сообщений;
  • четыре элемента управления типа TextBox для ввода данных в полях Num_book , Name , Group , Year .

Нужно настроить следующие свойства элементов управления:

  • в элементе управления button1 свойство Text = « OK «;
  • в элементе управления button2 свойство Text = « Cancel «;
  • в элементе управления button1 свойство DialogResult = « OK «;
  • в элементе управления button2 свойство DialogResult = « Cancel «;
  • в элементе управления label1 свойство Text = « Num_book «;
  • в элементе управления label2 свойство Text = « Name «;
  • в элементе управления label3 свойство Text = « Group «;
  • в элементе управления label4 свойство Text = « Year «.

Также настраиваем видимость элементов управления типа TextBox . Для этого во всех элементах управления textBox1 , textBox2 , textBox3 , textBox4 значение свойства Modifiers = « public «.

C# Windows Forms Вид форма

Рис. 18. Вид новосозданной формы

7. Добавление кнопок вызова команд манипулирования данными таблицы Student .

Для дальнейшей работы нужно с помощью мышки переключиться на главную форму Form1 .

На главную форму приложения Form1 добавляем три кнопки ( Button ). Автоматически будет создано три переменных-объекта с именами button1 , button2 , button3 . В каждой из этих кнопок вносим следующие настройки (окно Properties ):

  • в кнопке button1 свойство Text = « Insert … » (вставить запись);
  • в кнопке button2 свойство Text = « Edit … » (изменить запись);
  • в кнопке button3 свойство Text = « Delete «.

В результате внесенных изменений главная форма будет иметь вид как показано на рисунке 19.

C# Windows Forms Главная форма приложения

Рис. 19. Главная форма приложения

8. Программирование события клика на кнопке « Insert… «.

Обработчик события клика на кнопке « Insert… » имеет вид:

Сначала вызывается форма Form2 . После получения результата « OK » (нажатие соответствующей кнопки), в форме Form2 заполненные поля в элементах типа TextBox включаются в строку SQL -запроса. SQL -запрос добавления новой строки имеет вид:

где value1 отвечает номеру зачетной книжки; value2 – фамилия студента; value3 – группа, в которой учится студент; value4 – год вступления.

Строка соединения с базой данных Connection String описывается в переменной conn_string (см. п. 5). Объект класса SqlConnection осуществляет соединение приложения с источниками данных. Кроме того, класс Connection решает задачи аутентификации пользователей, работу с сетями, идентификацию баз данных, буферизацию соединений и обработку транзакций.

Команда на языке SQL , добавляющая запись к таблице, инкапсулирована в классе SqlCommand . Конструктор класса SqlCommand принимает два параметра: строку запроса на языке SQL (переменная cmd_text ) и объект класса SqlConnection .

Метод ExecuteNonQuery() реализован в интерфейсе IDBCommand . Метод реализует SQL -команды, которые не возвращают данные. К таким командам относятся команды INSERT , DELETE , UPDATE а также хранимые процедуры, которые не возвращают данных. Метод ExecuteNonQuery() возвращает количество задействованных ним записей.

9. Программирование события клика на кнопке « Edit… «.

Обработчик события клика на кнопке « Edit… » имеет вид:

В этом обработчике выполняется SQL -команда UPDATE , которая изменяет текущее значение активной записи.

Автоматизация обмена данными Qt форм с SQL базой данных

Данная статья описывает решение для выполнения рутинных процедур заполнения и сохранения данных форм в\из SQL базы данных. Код сложный. Для его понимания надо хорошо знать фреймворк Qt по части QtGui, QtSql. И хотя бы средне C++.

История

Как то раз пришлось работать над проектом, написанным на Qt. Бэкендом была самая обычная SQL база данных. Приложение напоминало адресную книгу. Но там было около сотни всяких Qt форм и диалогов. Все эти формы обслуживались простым кодом на С++. Который просто берёт данные из базы, просто расталкивает их по простым полям. И затем, при закрытии формы просто сохраняет в базу.

Всё было хорошо какое то время. Но начали появляться подозрения что то тут не так. Хотя бы потому что ‘firstname’ в запросах упоминалось два раза. На первый взгляд ничего страшного. На второй ‘firstname’ можно было вынести в статическую переменную. Но всё это было не то. Вроде код работает. Но что то тут надо радикально поменять.

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

  • Колонки для полей ввода (‘firstname’) и имена таблиц должны задаваться 1 раз. В идеале это должны быть property у виджетов указываемые через редактор (QtDesigner).
  • Рутинные SQL запросы должны делаться на основе этих property с минимумом кода.
  • Форма должна содержать только код специфичный для некоторых полей и самой формы. Простое заполнение из БД и сохранение не должно занимать места в реализации. Нужен был универсальный код для всех форм.
  • Код должен уметь заполнять форму данными из нескольких таблиц.
  • Должно оставаться место для «грустного кода» из примера выше. Он мог пригодится во всяких нестандартных ситуациях.

В общем всё надо было отшлифовать в лучших традициях ООП. При этом я плохо представлял себе как это будет реализовано. Такой код был получен. Конечно сейчас этот код навевает на меня не меньшую грусть чем пример выше. Но он работал. Он так хорошо работал что успел забыть как он работал. А я с этим кодом работал так. Делал форму со всеми полями ввода на ней. И добавлял к каждому полю property, в котором хранилось имя столбца в БД, где хранились данные из этого поля. Потом, в конструкторе класса формы, писал волшебные строки типа setupForm( «persons» ); и fillForm( dbID ); Т.е. образно говорил форме «настрой на использование таблицы ‘persons’ » и «заполни её данным из строки хранящейся под ключом из переменной dbID». Форма делала что ей говорят. Остальное были уже проблемы базового класса, где эти методы и были реализованы.

Как вы уже догадываетесь реализация состояла из этих двух строк и общего кода, генерируемого QtCreator-ом. Форма с сотней полей, содержала кода в реализации даже меньше, чем в примере выше. Но иногда приходилось вызывать fillForm() ещё раз. Для того чтобы заполнить поля из связанных SQL таблиц. Типа fillForm( anotherRecordId, «address» ).

Поскольку мой код из продакшена доступен только посвящённым. Пришлось написать данное решение заново. А поскольку со временем все мы набираемся опыта. Он получился гораздо лучше оригинального. Весь код был оформлен в виде приложения — адресной книги. И залит на github. Далее здесь будут многословные объяснения как оно устроено и работает.

Тест решения

Для теста надо иметь QtCreator c Qt не ниже 5.0. Лично я собирал проект с Qt 5.5.0 компилятором gcc 5.3.1. Хотя проект будет собираться и даже работать на Qt 4.8.1. Однако некоторые «спецэффекты» делают программу там не очень дружелюбной.

  1. Скачайте проект «git clone github.com/stanislav888/AddressBook.git»
  2. Меняете текущий каталог «cd AddressBook»
  3. Инициализируйте подмодуль «git submodule init»
  4. Подгружаете код подмодуля в проект «git submodule update»
  5. Открываете и собираете проект
  6. Запускаете программу
  7. Если всё хорошо, появиться окно выбора\создания файла базы данных. Можете посмотреть что за программа. Для заполнения тестовыми данными есть кнопочка «Fill test data»
  8. Удаляете созданную БД кнопкой «Delete DB file»
  1. В функции AddressBookMainWindow::createDb() добавьте любой, новый столбец к созданию таблицы «persons»(PERSONS_TABLE_NAME). Что-то типа ‘ << «middlename TEXT» ‘ только со своим названием столбца.
  2. Откройте файл addressbookmainwindow.ui в редакторе форм
  3. Добавьте туда виджет для редактирования нового поля. Для начала пусть будет QLineEdit.
  4. У нового виджета создайте property с именем «c»(column), значением-именем нового столбца. Созданного в п.1
  5. Запускаете программу. Вас опять должны спросить где хранить файл базы. Если нет. Удаляете базу и запускате программу снова
  6. Видите данное поле. Сохранение и заполнение данных там будет настроено автоматом. Для теста можете поменять поле и изменить выделение в таблице слева. На другую строку и обратно
  7. Следующий пример. Добавление поля из связанной таблицы.
    Добавьте что-то типа ‘ << «postcode TEXT» ‘ в создание таблицы «address»(ADDRESS_TABLE_NAME) там же.
  8. Потом добавьте опять QLineEdit на форму addressdialog.ui property с именем «c» опять со значением — именем колонки которое вы добавили в предыдущем шаге
  9. Так же удалите файл с базой и запустите программу. Укажите имя файла новой базы
  10. На главной форме кликаете «Choose address» и видите диалог с вашим новым QLineEdit. Он должен так же сохраняться в базу как и другие поля
  11. Заполните любой адрес с вашим новым полем и выбелите его(«Select address»)
  12. Закройте программу
  13. Откройте addressbookmainwindow.ui для редактирования и абсолютно так же добавьте такое же поле с тем же property в этот файл
  14. Дополнительно добавьте property «t»(table) со значением «address»
  15. Далее надо было добавить заполнение данных из таблицы «address» в данной форме. В функции void AddressBookMainWindow::updateForm(). Уже есть такой код «m_widgetHelpers.fillForm( addressId, ADDRESS_TABLE_NAME );»
  16. Запускаем, проверяем. Новое поле должно заполняться и сохраняться в обоих формах

Обзор кода

Файлы проекта

  • Папка common. Все общие файлы, которые имеет смысл тащить в другие проекты для добавления «волшебного» функционала. Выделены в отдельный проект
  • common/widgethelpers.* «Помошники виджета». Или реализация «велосипеда» для заполнения форм.
  • setupdialog.* диалог спрашивающий где база данных
  • addressbookmainwindow.* основное окно программы. Там же код инициализации БД.
  • addressdialog.* форма выбора адреса.

Скажу сразу. Не хотел делать эту программу для использования простыми пользователями. Я делал код который может стать основой других проектов. Поэтому иногда там могут использоваться неидеальные решения. Просто потому что бы сохранить универсальность WidgetHelpers и подобных классов.

Классы проекта

WidgetHelpers

    void setupForm( QWidget* fornPointer, const QString& defaultTableName );

Настраивает поля формы, у которых определён property COLUMN_NAME_PROP на сохранение данных в БД после изменения фокуса ввода.

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

defaultTableName — SQL таблица «по умолчанию». Если у поля не присутствует property «t»(TABLE_NAME_PROP), то defaultTableName записывается в это property.

Таким образом у формы будет некая таблица «по-умолчанию». Которую не надо явно указывать в свойствах виджета.

Заполняет поля ввода данными из базы. Надо вызывать 1 раз для полей каждой SQL таблицы на форме.

tableName -имя SQL таблицы, поля которой заполняются на форме. Если оно не указано явно. То заполняются поля для таблицы «по-умолчанию» см. defaultTableName выше.

tableRecordId — ID строки в таблице, данные которой надо заполнить для редактирования на форме. Если туда передать просто QVariant(). Т.е. «null». Который может вернуть нам запрос к базе. То соответствующие поля очистятся и залочатся.

Извлекает любое значение из кэша. Используется для извлечения foreign key при добавлении новых записей в кэш. Так же можно извлекать пользовательские данные для заполнения каких то отдельных виджетов напрямую. Без участия fillForm().

Добавление данных для заполнения полей ввода в кэш m_tablesRecords. Обычно вызывается из fillForm(). Можно вызвать явно, когда установили параметр recordId, на основе getFieldValie() И не требуется fillForm().

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

AddressBookMainWindow

Основное окно программы. Запускается, ищет базу. Если не находит, спрашивает у пользователя где файл с базой. Если указать несуществующий файл, создаёт базу и записывает путь в настройки. Содержит таблицу с контактами адресной книги слева и детали по каждой записи справа. Таблица использует QSqlTableModel как источник данных. Форма же берёт данные непосредственно из базы через функционал WidgetHelpers, сохраняет так же. QSqlTableModel может сохранять данные в базу. Странно что на форме раздельное сохранение данных для таблицы и простых полей. QSqlTableModel иногда работает с ошибками. Потом, у него немного ограниченный функционал. Поэтому вы можете плюнуть и воспользоваться QSqlQueryModel. Который уже ничего не сохраняет, но и ограничений у него нет. В этом случае таблица будет только для чтения. И функционал сохранения простых полей в правой части будет нужен. Для тех кто реально хочет сохранять через QSqlTableModel(m_personsModelPtr). WidgetHelpers(m_widgetHelpers) выбрасывает сигнал dataChanged( QString tableName, QString columnName, QVariant id, QVariant value ); Хотя тут ещё нужна логика предотвращающая сохранение в WidgetHelpers::saveDataSlot(). Здесь не реализована за ненадобностью. Так же на форме есть другая особенность. Комбобокс ui->countryCombo. Нужен только для того чтобы показать как сохранять и заполнять данные из связанных SQL таблиц. Здесь это таблица «country»(COUNTRY_TABLE_NAME) связанная через «address»(ADDRESS_TABLE_NAME). Обычно он скрыт от посторонних глаз т.к. менять страну вне остального адреса будет очень странно. Кто хочет открывайте и экспериментируйте (ui->countryCombo->hide(); ).

Концептуально, данное окно(AddressBookMainWindow) должно наследоваться от WidgetHelpers. Но по факту разработчики Qt ограничили стандарт С++. И оставили много граблей для желающих воспользоваться всеми возможностями языка. Поэтому здесь и далее применена именно агрегация, что бы не запутать и без того сложный код. Если вы видите недостатки такого подхода. Значит вы же должны видеть и выход в каждом конкретном случае. Если не видите ничего дурного. Значит пока об этом думать не стоит. Код работает и этого достаточно.

AddressDialog

Диалог выбора адреса из списка. Работает как и AddressBookMainWindow. Но не стал выносить абсолютно весь подобный код для левой таблицы в WidgetHelpers. Таблицы пока не являются нашей целью. А вот работа с виджетами ввода делается также.

Как устанавливаются значения в виджетах

Как уже заметили пытливые умы. В WidgetHelpers есть две интересные функции static void setWidgetValie(const QVariant &valie, QObject * const inputBox); и static QVariant getWidgetValie(const QObject* const sourceBox); они берут значения из любого виджета и записывают значение в любой виджет, где это имеет смысл. В случае с простыми виджетами типа QLineEdit, QSpinBox используется решение от Qt. Это функции «сеттеры» и «геттеры» обозначенные как «USER». Для примера, в файле «qlineedit.h» есть строчка «Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged USER true)» Есть даже документация чего это заклинание обозначает.

Кроме простых случаев есть, например, случай QComboBox. «Q_PROPERTY(QString currentText READ currentText WRITE setCurrentText NOTIFY currentTextChanged USER true)». На первый взгляд тут ничего страшного нет. Но поскольку комбобоксы, как правило перечисления из БД. Нам было бы удобнее устанавливать значения по вторичному ключу из БД, а не по строке видимой пользователю. Поэтому тут логика изменена. Значение устанавливается по ключу из БД. хранящемуся в UserRole модели комбобокса.

Потом есть случай с группой QRadioButton -ов. Такое на формах тоже может быть перечислением из БД. И лень устанавливать эти переключатели руками. Т.е. надо выбрать тот переключатель, значение которого сохранено в БД. Для этого есть property «v»(VALUE_PROP). Содержащее значение хранимое в базе. Настраивается оно очень интересно. У логически связанных QRadioButton -ов должна быть назначена QButtonGroup. Но COLUMN_NAME_PROP, TABLE_NAME_PROP задаются у любого одного QRadioButton. Просто для удобства разработчика. Код сам разберётся что делать с группой. VALUE_PROP задаются у всех переключателей разные.

В AddressBookMainWindow реализован, наверное, самый сложный случай группы переключателей. Для выбора пола контакта. Там добавлен фейковый QRadioButton, на случай когда в БД храниться NULL.

Как показать страну двумя разными способами

Теперь, для лучшего усвоения, разберём самый ужасный и запутанный пример. На форме addressbookmainwindow.ui есть QComboBox ui->countryCombo. Что бы его видеть нужно закомментировать ui->countryCombo->hide(); Для его заполнения данными из базы. Надо заполнить поля связанные с таблицей «address». Потом есть ui->countryLabel. Для него надо заполнить поля связанные с таблицей «country».

Делается это так:

  1. Сначала идёт вызов m_widgetHelpers.setupForm( this, PERSONS_TABLE_NAME ); в конструкторе.
  2. Первая строка m_widgetHelpers.fillForm( id ); заполняет форму данными таблицы «по-умолчанию» (defaultTableName в setupForm()). В нашем случае это «persons» (PERSONS_TABLE_NAME). Эта же функция добавляет(или замещает) нужную SQL строку(QSqlRecord) в кэш(m_tablesRecords).
  3. Далее m_widgetHelpers.getFieldValie() достаёт из кэша нужный «внешний ключ» на запись в таблице «address»(ADDRESS_TABLE_NAME).
  4. Полученный «addressId» используется в setAddress(). Что пока не имеет значения.
  5. Потом в m_widgetHelpers.fillForm( addressId, ADDRESS_TABLE_NAME );. Данный вызов заполняет все виджеты где явно указанно значение property «t» равным переменной ADDRESS_TABLE_NAME В том числе и ui->countryCombo. Этот же вызов подгружает в кэш строку из таблицы «address».
  6. Далее так же извлекается «внешний ключ»(countryId) на запись в таблице «country».
  7. И уже m_widgetHelpers.fillForm( countryId, COUNTRY_TABLE_NAME ) заполняет все виджеты где property «t» равно COUNTRY_TABLE_NAME(«country»). Т.е. ui->countryLabel

Разница тут в том что комбобокс сам работает с «foreign key». В качестве имени столбца ему задано «countryid»(COUNTRY_FK_COL_NAME) из таблицы «address»(ADDRESS_TABLE_NAME). Тогда как для ui->countryLabel надо добавлять строку из таблицы «country» в кэш(что сделано неявно). И уже потом заполнять виджет данными из кэша. Получается что fillForm( countryId, COUNTRY_TABLE_NAME ); нужен только для ui->countryLabel. Конечно два поля выводящих страну, по соседству не нужны. Поэтому одно из них было скрыто.

ui->countryLabel заполняется благодаря property «c» и «t». Этих property нет у виджета в addressbookmainwindow.ui. Они задаются программно.

Смысла в этом особого нет. Просто пример что так тоже можно заполнять property. Можете закомментировать эти строки и определить их через редактор для форм. Такая настройка property имеет смысл только до setupForm().

Профит

Сразу после разработки всего этого. Внезапно стали появляться новые возможности. Одна из них вывод дополнительной отладочной информации о поле во всплывающих подсказках к виджету. При наведении курсора на виджет появляется что то типа «t = persons, c = skype, Что значит таблицу, столбец и первичный ключ строки которыми было заполнено данное поле. При этом оригинальные подсказки, если они статичные. Никуда не деваются. Динамичные тоже прикрутить не проблема. Думаю это будет «нерукотворный памятник» разработчику для тестеров.

QDataWidgetMapper

Конечно же такое моё решение, кажется немного велосипедным по сравнению с использованием решения на основе QDataWidgetMapper. Признаюсь пытался использовать этот класс. Но он банально не захотел работать. Можно конечно зарыться в исходники Qt и выяснить что же там такое. При этом решением мог быть патч к Qt либо своя реализация маппера. Что меня совсем не устраивало. Я хотел просто задавать имена столбцов для виджета в QtDesigner. Это очень наглядно и не захламляется файл реализации формы. QDataWidgetMapper же не совсем то. Надо ручками линковать столбец в модели и виджет. При этом я обязан использовать ненадёжную модель QSqlTableModel. У меня с SQLite она работает. Но в Qt не одна SQLite. Непонятно какие фокусы эти модели будут выкидывать с другими базами. А мне хотелось сделать универсальное решение. Потом, QDataWidgetMapper не захочет поддерживать QComboBox и QRadioButton, как это делаю я.

Заключение

На мой взгляд велосипед получился очень удачным. Пишите комментарии, пинайте меня сильно. Ведь это моя первая статья здесь. Если вам понравиться данная тема. Есть идея написать о моделях (которые QAbstractItemModel).

Вносим пользовательские данные в базу данных MySql

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

В прошлом уроке я рассказала Вам о том, как установить Денвер на Ваш компьютер, как создать свою базу данных, пользователя для нее, как создать таблицу в базе данных и мы заполнили ее одной записью.

В этом уроке мы создадим html документ для ввода пользовательской информации, а также php файл-обработчик этой информации, который будет обрабатывать данные, соединяться с базой данных MySql и вставлять туда новые записи.

Переходя от слов к делу давайте начнем.

Добавляем пользовательские данные в базу MySql с веб страницы

Первый этап: создаем html форму для ввода данных

С самого начала нам нужно подготовиться к работе с php, MySql и к тестированию написанного кода на локальном компьютере. Для этого:

1. Запустите Denwer на своем компьютере.

2. Откройте виртуальный диск, созданный Денвером (например у меня это диск “Z”). Откройте его, дальше: home – localhost – www – там создайте новую папку и дайте ей название (я дам название “db1”).

3. Если Вы работаете в Adobe Dreamweaver, то зайдите в менеджер сайтов, там нажмите на кнопку «New», в качестве пути выберите путь до только что созданной папки, в поле выше можете дать имя сайту, после этого нажмите Save – Done. После всего этого в правой панели Adobe Dreamweaver появится Ваша папка.

1. Сейчас мы создадим обычный html файл (назовем его info_form.html и сохраним в только что созданной папке db1) и пропишем там код формы для ввода информации. В нашей таблице users базы данных new_db есть 4 поля, которые мог бы заполнить пользователь (поле id будет заполняться автоматически). Исходя из этого можно создать код следующего вида:

Здесь в параметре «action» нашей формы прописан файл form.php. Он будет являться файлом обработчиком, который мы создадим далее.

Давайте еще создадим файл style.css для придания стилей нашей форме. Он уже подключен в коде, так что осталось только создать его, поместить в ту же папку, что и html файл и прописать в нем следующий код:

Теперь форма выглядит следующим образом:

Однако, если Вы введете данные и попытаетесь отправить форму, то увидите ошибку, так как никакого файла form.php, лежащего в каталоге scripts не существует.

Создать файл-обработчик – это наша следующая задача.

2. Давайте внутри папки db1 создадим папку с названием «scripts». В ней мы будем сохранять все наши скрипты взаимодействия с базой данных MySql.

После того как папка будет создана, создайте новый php файл и сохраните его в папке scripts под именем form.php.

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

Скорее всего в Вашем проекте Вам придется соединяться с базой данных MySql не только из одного файла. Как правило с базой данных взаимодействуют различные файлы проекта.
Очень непрактично в каждом таком файле прописывать один и тот же код подключения к базе. А если таких файлов, например, будет 50 и в один прекрасный день вы смените пароль для пользователя и Вам придётся искать все эти 50 файлов и в каждом делать исправление.
Гораздо удобнее использовать для подключения отдельный файл, который будет подключен к каждому из файлов, где должно быть соединение с базой данных MySql. В таком случае вносить исправления нужно будет только в один файл.

Итак, давайте создадим новый php файл, назовем его connect.php и поместим в папку для скриптов. В нем пропишем код соединения с нашей базой данных MySql, а также код, который будет сообщать об ошибках в случае их возникновения. Обратите внимание, что в качестве параметров Вам необходимо будет прописать Ваше имя пользователя, Ваш пароль и Ваше имя базы данных. В качестве хоста должен быть localhost.

Теперь перейдем в файл form.php и подключим в него файл connect.php с помощью следующего кода:

Если сейчас Вы попробуете отправить форму, то увидите после отправки пустую веб страницу. Это нормально, так как мы просто соединились с базой и пока больше ничего не выводим.

Если Вы увидели сообщение об ошибке, то проверьте правильность всех параметров (имя пользователя, пароль, имя хоста: localhos, имя базы данных), а также будьте уверены, что Ваш Денвер включен.

3. Мы удачно соединились с базой данных MySql, а теперь нам нужно принять введенные в форму данные в наш файл обработчик. В этом нам помогут атрибуты “name”, которые присутствуют в html документе.

Для получения данных мы воспользуемся специальной переменной php, снабжающей нас всей информацией из веб-формы. Эта переменная называется “$_REQUEST”.

Пропишите в файле form.php после подключения файла connect.php следующий код:

4. Данные в файл мы получили и занесли их в переменные. Теперь нужно отправить эти данные в нашу таблицу базы данных MySql. Для этого ниже нужно прописать следующий код:

Здесь сначала мы формируем запрос, говоря, что нам нужно вставить соответствующие переменные в соответствующие поля таблицы “users”. Заносим этот запрос в переменную “$insert_sql”. А потом с помощью специальной функции mysql_query исполняем данный запрос.

Если сейчас Вы заполните и отправите форму, а потом посмотрите в таблицу “users” Вашей базы данных, то увидите новую запись, которая там появилась после отправки.

5. Мы вставили новую запись из веб страницы в таблицу базы данных MySql. Теперь хочется немного коснуться того формата, в котором вставляются наши данные.

Во-первых, нужно позаботиться о той ситуации, когда человек, заполняя форму может поставить ненужные пробелы в начале ввода информации. Их нужно обрезать.

Во-вторых, у нас существует поле для Facebook. Если мы в последующем захотим выводить эту информацию как ссылку, то необходимо позаботиться, чтобы данные в этом поле хранились в правильном формате (то есть «http://www.facebook.com/идентификатор на facebook»). Но пользователь не всегда будет вводить эти данные так как нам нужно. Он может ввести: “www.facebook.com/идентификатор на facebook”, “facebook.com/идентификатор на facebook” или просто “/идентификатор на facebook”.

Этих ситуаций нужно избегать. Для этого давайте подкорректируем наш код. Возможные лишние пробелы мы обрежем при помощи функции trim, а проверять правильность введенного url для facebook будет функция preg_match. Таким образом весь код файла form.php будет выглядеть следующим образом:

О функции preg_match:
Это функция для поиска с регулярными выражениями.

Первый параметр в скобках – это регулярное выражение, второй – строка, где нужно искать.

Функция возвращает только первое совпадение: 0 – если совпадений нет, 1 – если совпадение есть.

Попробуйте теперь намеренно заполнить форму, сделав ненужные пробелы в начале заполнения какого-нибудь из полей и введя адрес для facebook без http:// или вообще введя только идентификатор facebook. Отправьте запрос, а потом перейдите в базу данных и Вы увидите, что несмотря на не совсем корректное заполнение, данные имеют именно тот вид, который нам нужен.

На этом буду заканчивать данный урок. Все файлы этого урока Вы можете скачать в исходниках (только не забудьте исправлять параметры на свои в файле connect.php).

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

Оставляйте свои комментарии и делитесь с друзьями с помощью кнопок социальных сетей.

Глава 10 Обработка баз данных с использованием технологии ado.Net

Покажем, как можно создать базу данных SQL Server в среде Visual Studio 2010. В этой простейшей базе данных будет всего одна таблица, содержащая сведения о телефонах ваших знакомых, т. е. в этой таблице будем иметь всего три колонки: Имя, Фамилия и Номер телефона.

Запустим Visual Studio 2010, закажем новый проект шаблона Windows Forms Аpplication С#, зададим имя — BД_SQL_Server. Далее непосредственно создадим новую базу данных SQL Server. Для этого в пункте меню Project выберем команду Аdd New Item (т. е. добавить новый элемент) и в появившемся одноименном окне укажем шаблон Local Database (локальная база данных), введем имя файла (в поле Name) Vic.sdf и последовательно щелкнем на кнопках Add, Next, Finish.

Теперь добавим таблицу в базу данных, для этого в пункте меню View выберем команду Server Explorer (Обозреватель баз данных). В обозревателе баз данных развернем узел (щелчком мыши) Vic.sdf и выберем Tables (Таблицы). Щелкнем правой кнопкой мыши на пункте Tables, а затем выберем пункт Create Table (Создать таблицу). Откроется окно New Table. Назовем новую таблицу (поле Name) БД телефонов. Заполним структуру таблицы, как показано на рис. 10.1. Нажмем кнопку ОК, чтобы создать таблицу и закрыть окно New Table. Чтобы исключить повторяющиеся записи (т. е. строки в таблице), следует на­учить первичные ключи (или ключевые столбцы). Ключевым столбцом назначачают столбец в таблице, который всегда содержит уникальные (неповторяющиеся в данной таблице) значения. Однако в нашей таблице могут быть люди с одинако­вый именами или одинаковыми фамилиями, т. е. в нашей таблице в качестве пер­ечных ключей следует использовать одновременно два столбца: столбец Имя и столбец Фамилия. Представьте себе, что у нас уже есть сотни записей в таблице, и при попытке ввести вторую строку, содержащую то же самое значение, появляется сообщение об ошибке. Это очень технологично, удобно!

Рис. 10.1. Формирование структуры новой таблицы

Чтобы добавить первичные ключи в таблицу, в Server Explorer развернем yзел Tables. Далее щелкнем правой кнопкой мыши на нашей только что созданной таблице и выберем пункт Edit Table Schema, затем для полей Имя и Фамилия укажем для параметра Allow Nulls значение No, т. е. обяжем нашего пользователя всегда заполнять эти поля (ячейки таблицы). Далее для параметра Unique (Являются ли эти поля уникальными?) ответим No, поскольку и имена, и фамилии повторяются. И, наконец, назначим колонки Имя и Фамилия первичными ключами (Primari Key Yes). Нажмем кнопку OK для сохранения этих настроек и закрытия okhа Edit Table — БД телефонов.

Теперь добавим данные в таблицу. Для этого в окне Server Explorer щелкнем правой кнопкой мыши на пункте БД телефонов и выберем команду Show Tabl Data. Откроется но данных таблицы, как показано на рис. 10.2, но только пока пустое.

Рис. 10.2. Заполнение ячеек таблицы

Далее заполним данную таблицу. Для нашей демонстрационной цели введем пять строчек в эту таблицу. После ввода в меню File выберите команду Save All для сохранения проекта и базы данных. Теперь убедитесь, что в папке проекта по­вился файл Vic.sdf. Его можно открыть вне проекта с помощью Microsoft Visual Studio 2010 для редактирования базы данных.

Пример базы данных можно найти в папке БД_SQL_Server.

Пример 64. Отображение таблицы базы данных SQL Server в экранной форме

Имея базу данных, например базу данных SQL Server, в виде файла Vic.sdf, созданного в предыдущем разделе, покажем, как очень легко можно вывести таб­лицу из этой базы в экранную форму.

Для этой цели запустим Visual Studio 2010, закажем новый проект шаблона Windows Application С# и укажем имя проекта — БД_SQL_Server2. Далее в меню View выберем команду Server Explorer. Щелкнув правой кнопкой мыши на значке Data Connections, добавим соединение — Add Connection, а в качестве источника данных Data source укажем Microsoft SQL Server Compact 3.5 и щелкнем на кнопке ОК. Далее, нажмем кнопку Browse, найдем созданный в прошлом проекте файл базы данных Vic.sdf и нажмем кнопку ОК. Теперь в окне Server Explorer мы видим значок базы данных Vic.sdf.

Далее в меню Data выберем команду Add New Data Source, тем самым мы запустим мастер Data Source Configuration Wizard. Здесь последовательно нажима­ем кнопки Next, Dataset, Next. На запрос мастера копировать ли файл Vic.sdf в наш текущий проект нажмем кнопку Да.

В результате в окне Solution Explorer появится значок базы данных Vic.sdf и значок объекта vicDataSet.xsd, но база данных в текущем проекте будет пустой. Для заполнения базы данных в меню Data укажем Show Data Source и в появив­шемся окне Data Source, щелкнув правой кнопкой мыши на значке vicDataSet, вы­берем пункт Configure Data Source With Wizard Finish. Теперь из окна Server Explorer перетащим узел БД телефонов на появившуюся вкладку vicDataSet.xsd. Затем из окна Data Source перетащим узел БД телефонов на вкладку конструктора формы Form1.cs[Design]. Как видно из рис. 10.3, автоматически появилось не­сколько программных объектов, необходимых для отображения данных из табли­цы базы данных.

Заметьте, мы пока не написали ни одной строчки программного кода. Теперь запускаем отладку программы — нажимаем клавишу <F5>.

Как видим (рис. 10.4), в форме благодаря элементам управления DataGridView и BindingNavigator появилось отображение таблицы из базы данных. Мы имеем возможность модифицировать существующие записи (строки), добавлять новые записи (New), удалять записи из таблицы (Delete), сохранять данные (Save Data) с помощью соответствующих кнопок. То есть имеем полный набор основных четырех функций по редактированию таблицы базы данных.

Рис. 10.3. Проект формы с объектами для отображения таблицы базы данных

Рис. 10.4. Фрагмент работы программы

Убедиться в работоспособности данной программы можно, открыв файл решения БД_SQL_Server2.sln в папке БД_SQL_Server2. Обратите внимание на то, что копия исходной базы данных Vic.sdf находится в папке проекта bin\Debug, именно этот файл претерпевает изменения при редактировании таблицы в данном проекте

Создание базы данных в среде MS Access

Вначале создадим базу данных (БД) vic.mdb средствами Access пакета MS Office. Поясню сразу, что реальный положительный эффект от решения какой-либо задачи информатизации с использованием баз данных можно ощутить, если коли чество записей (т. е. количество строк в таблице) превышает 100 тысяч. В этом случае очень важным (решающим) фактором оказывается скорость выборки. Однако для примера работы мы будем оперировать совсем маленькой БД. Чтобы читатель данной книги смог реально повторить наши действия, создадим базу данных телефонов ваших контактов.

Рис. 10.5. Заполнение таблицы базы данных в среде MS Access

Структура (поля) таблицы будет сдующей: Номер п/п, ФИО и Номер телефона. Для этого запустим на компьютере офисное приложение Microsoft Access, далее в меню Создать выберем команду Новая база данных (или нажимаем комбинацию клавиш <Ctrl>+<N>), зададим папку для размещения БД и имя файла— vic.mdb. Затем в появившемся окне viс: база данных выберем команду Создание таблицы в режиме конструктора. Далее зададим три поля (т. е. три колонки в будущей таблице): имя первого поля — Номер п/п, тип данных — Счетчик; следующее имя поля — ФИО, тип данных — Текстовый; третье имя поля — Номер телефона, тип данных — Текстовый.

При сохранении структуры таблицы появится запрос на имя таблицы, укажем: БД телефонов. В БД может быть несколько таблиц, а данную таблицу мы назвали именно так. Заметьте, что при работе в обычных приложениях, если вы решили отказаться от внесенных изменений в документе, то его просто закрывают без со­хранения. Однако при работе с БД все изменения сохраняются на диске без нашего ведома. Запись на диск происходит напрямую, минуя операционную систему.

Далее двойной щелчок в пределах созданной таблицы — и приступаем к ее за­полнению. В нашем примере в таблице всего семь записей (рис. 10.5).

Теперь закроем СУБД Access и откроем созданную нами таблицу БД vic.mdb в среде Visual Studio 2010.

Пример 65. Редактирование таблицы базы иных MS Access в среде Visual Studio без написания программного кода

Запупкаем Visual Studio 2010, однако далее мы не заказываем новый проект. Сейчас наша цель — открыть созданную нами базу данных в среде Visual Studio. Для этого выберем пункт меню View | Server Explorer. Здесь, щелкнув правой кнопкой мыши на значке Data Connections, выберем пункт Add Connection и в качестве источника данных (Data source), нажав кнопку Change, Microsoft Database File (OLE DB). Далее с помощью кнопки Browse зададим путь и например C:\vic.mdb. Теперь проверим подключение— кнопка Test Connection. Успешное подключение выдаст сообщение, представленное на рис. 10.6

Рис. 10.6. Тестирование подключения

Проверка подключения выполнена, щелкнем на кнопке ОК. Теперь в окне Server Explorer раскроем узлы, символизирующие базу данных, таблицы, поля в таблице.

Рис. 10.7. Редактирование таблицы базы данных в среде Visual Studio

Далее щелкнем правой кнопкой мыши на узле БД телефонов и выберем команду Retrieve Data. В результате в правом окне получим содержимое этой таблицы как показано на рис. 10.7. Здесь данную таблицу мы можем редактировать, т.е. изменять содержимое любой записи (Update), добавлять новые записи (Insert), т.е. новые строки в таблицу, удалять записи (Delete). Кроме того, щелкая правой кнопкой мыши в пределах таблицы и выбирая в контекстном меню пункты Panel SQL, можно осуществлять SQL-запросы к базе данных, в том числе наиболее часто используемый запрос Select.

Пример 66. Отображение таблицы базы данных MS Access в экранной форме

Поставим задачу вывода таблицы базы данных MS Access в экранную форму с возможностью редактирования базы данных, как мы это сделали для базы данных SQL Server. Разница будет состоять лишь в том, что мы не будем копировать базу данных в наш проект, а подключимся к существующей базе данных. Сразу скажу, что данная задача решается аналогично.

Запустим Visual Studio 2010 и закажем новый проект шаблона Windows Forms Application С#, укажем имя проекта— БД_mdb. Откроется новый проект Windows Forms. В пункте меню Data (Данные) щелкнем на пункте Add New Data Source, при этом запустится Data Source Configuration Wizard (Мастер настройки источников данных). Выберем Database (База данных) и нажмем кнопку Next. Да­лее после выбора модели Dataset и нажатия кнопки Next нажмем кнопку New Connection (Новое подключение).

Откроется диалоговое окно Add Connection (Добавить подключение). В этом диалоговом окне проверим, является ли источник данных (Data source) Microsoft Access Database File (OLE DB). Если нет, то нажмем кнопку Change и выберем Microsoft Access Database File в диалоговом окне Change Data Source, а затем нажмем кнопку ОК.

Щелкнув на кнопке Browse, перейдем в место сохранения базы данных vic.mdb, далее щелкнем на значке файла базы данных и на кнопке Открыть. На­жмем кнопку ОК, чтобы закрыть диалоговое окно Add Connection, затем в масте­ре настройки источников данных нажмем кнопку Next. Если будет предложено копировать файл данных в проект, нажмем кнопку Нет.

Опять нажмем кнопку Next. На следующей странице мастера необходимо уста­новить флажок возле всех объектов базы данных, при этом имя объекта DataSet будет vicDataSet. Нажмем кнопку Finish для продолжения. Перейдя в меню Data | show Data Sources, получим в окне Data Sources узлы объектов базы, показанные на рис. 10.8.

Теперь перетащим узел БД телефонов из окна Data Source в проект экранной формы, при этом можно использовать метод копирования — вставки (<Ctrl>+<C>, <Ctrl>+<V>). Заметьте, что некоторые элементы управления автоматически добавятся в форму, также будут созданы некоторые компоненты и добавлены в область компонентов под формой. Появится элемент управления DataGridView, который будет отображать строки и столбцы таблицы, и элемент управления для переходе (AddressesBindingNavigator). Кроме того, система создает компоненты, которые подключаются к базе данных, управляют извлечением и обновлением данных хранят данные в локальном объекте DataSet (AddressesBindingSource, Addresses. TableAdapter и FirstDatabaseDataSet соответственно).

Нажмем клавишу <F5> для запуска приложения. Данные из таблицы телефонов отображаются в элементе управления DataGridView в форме, как показано на рис. 10.9.

Рис. 10.8. Узлы объектов базы данных

Рис. 10.9. Отображение таблицы на элементе управления DataGridView

Можно использовать элементы управления в BindingNavigator в верхней части формы для перехода между строками, можно даже добавлять или удалять записи а также изменять записи, изменяя данные, отображаемые в сетке, но эти изменения не будут сохранены до тех пор, пока не будет нажата кнопка сохранения (Save Data).

Как видите, мы не написали ни одной строчки программного кода. Среда Visual Studio 2010 автоматически сгенерировала программный код для управления пред­ъявляемой программой. Этот программный код можно просмотреть, открыв файл проекта Form1.Designer.cs.

Убедиться в работоспособности программы можно, открыв файл решения БД_mdb.sln в папке БД_mdb.

Пример 67. Чтение всех записей из таблицы БД MS Access на консоль с помощью объектов классов Command и DataReader

Напишем программу, которая минимальным количеством строк программного кода выводит на экран все записи (т. е. все строки) таблицы базы данных. При этом воспользуемся наиболее современной технологией ADO.NET. Технология ADO.NET— это преимущественно 4 объекта. Объект Connection обеспечивает соединение с базой данных. Объект Command обеспечивает привязку SQL-выражения к соединению с базой данных. А с помощью объектов DataSet и DataReaders можно просмотреть результаты запроса.

Здесь и далее мы рассмотрим четыре основных действия над базой данных: Select (выборка записей из таблицы БД), Insert (вставка записей), Update (моди­фикация записей в таблице БД), Delete (удаление некоторых записей из таблицы).

Для этого запустим Visual Studio 2010 и щелкнем на пункте New Project. Фор­ма нам в данном случае не нужна, поэтому выберем шаблон Console Application С#. Мы хотим вывести на экран простейшим способом таблицу. Если мы будем выводить ее при помощи функции MessageBox.show, то ровных колонок в окне MessageBox.show мы не получим, поскольку буквы, реализованные в этой функции, имеют разную ширину. Обычно в этом случае для вывода таблиц исполь­зуют шрифт Courier New или Consolas, но объект MessageBox не содержит возмож­ностей смены шрифта. Поэтому, идя по самому короткому пути, выводим таблицу из базы данных на консоль, т. е. на черный экран DOS. Здесь реализован моноши­ринный шрифт, где все символы имеют одинаковую ширину. Например, буква «Ш» и символ «.» (точка) имеют одинаковую ширину, следовательно, колонки в постро­енных таблицах будут ровными. Теперь на вкладке Program.cs напишем текст программы из листинга 10.1.

Листинг 10.1. Чтение всех записей из таблицы БД MS Access и вывод их на консоль

//Программа читает все записи из таблицы БД MS Access и выводит их

//на консоль с помощью объектов Command и DataReader

//Добавляем эту директиву для краткости выражений:

Using ОлеДиБи = System.Data.OleDb;

// Другие директивы using удалены, поскольку они не используются в данной программе

static void Main(string[] args)

var Подключение = new ОлеДиБи. OleDbConnectionC’Data Source=\»C:\\vic.mdb\» ,-User » +

» ID=Admin; Provider=\ «Microsoft. Jet -OLEDB. 4 . 0 \»;») ;

// Создаем объект класса Command, передавая ему» SQL-команду

var Команда = new ОлеДиБи.OleDbCommand(«Select * From [БД телефонов]», Подключение);

// Выбрать все записи и сортировать их по колонке «ФИО»:

// var Команда = new ОлеДиБи.OleDbCommand(

// «Select * From [БД телефонов] order by ФИО», Подключение);

// Аналогично по колонке «Номер п/п»: ‘

// var Команда = new ОлеДиБи.OleDbCommand(

// «Select * From [БД телефонов] ORDER BY ‘Номер п/п'»,

ОлеДиБи.OleDbDataReader Читатель = Команда. ExecuteReader(System.Data.CommandBehavior.CloseConnection);

while (Читатель.Read() == true)

// Цикл, пока не будут прочитаны все записи.

// Читатель.FieldCount — .кол-во полей в строке.

// Здесь три поля: 0, 1 и 2.

// Минус прижимает строку влево:

Console.WriteLine(» <0,-3) <1,-15><2,-15>«, Читатель.GetValue(0) Читатель.GetValue(1), Читатель.GetValue(2) ) ;

// Приостановить выполнение программы до нажатия какой-нибудь клавиш

Как видно, вначале создаем объект Подключение класса Сonnection и передаем ему строку подключения. В строке подключения полный доступ к mdb-файлу заключен в двойные кавычки. Это сделано для того, чтобы корректно читались длинные имена папок и файлов, содержащие пробелы.

Далее создаем объект класса Сommand и передаем ему простейшую SQL-команду:

Select * From [БД телефонов]

То есть выбрать все записи из таблицы [БД телефонов]. Название таблицы в SQL-запросе заключено в квадратные скобки из-за пробела в имени таблицы. За­метьте, что в комментарии указаны возможные варианты SQL-запроса: сортиро­вать записи по колонке ФИО (order by фио) и по колонке Номер п/п (order by ‘Номер п/п’ ).

Затем, используя объект класса DataReader, выполняем SQL-команду. Далее в цикле построчно читаем таблицу базы данных. При работе DataReader в памяти хранится только одна строка (запись) данных. Объект класса DataReader имеет бу­леву функцию Read, которая возвращает true, если существует следующая строка данных, и false, если такие строки (записи) уже исчерпались. Причем с помощью DataReader невозможно заранее узнать количество записей в таблице.

Результат работы программы показан на рис. 10.10.

Рис. 10.10. Отображение таблицы базы данных на консоли

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

Убедиться в работоспособности программы можно, открыв решение БДDataReader1.sln в папке БДDataReader1.

Пример 68. Создание базы данных MS Access в программном коде

Создадим программу, которая во время своей работы создает базу данных Access, т. е. файл new_BD.mdb. Эта база данных будет пустой, т. е. она не будет содержать ни одной таблицы. Наполнять базу данных таблицами можно впоследствии как из программного кода Visual C# 2010, так и используя MS Access. Заметим, что в этом примере технология ADO.NET не использована.

Запускаем Visual Studio 2010 (загрузочный модуль devenv.exe), щелкаем пункт меню меню New Project и выбираем шаблон Console Application С#. Для добавления в наш проект DLL-библиотеки ADOX выполним следующее. В пункте меню Project выберем команду Add Reference, затем на вкладке СОМ дважды щелкнем ссылке Microsoft ADO Ext. 2.8 for DDL and Security, тем самым мы добавляем библиотеку в текущий проект. Убедиться в том, что теперь существует ссылка эту библиотеку, можно в окне Solution Explorer. Здесь, щелкнув на узле References, увидим ветвь ADOX. Теперь мы можем ссылаться на это имя в программном коде. Далее вводим программный код, приведенный в листинге 10.2.

Листинг 10.2. Создание БД во время работы программы

// Программа создает базу данных MS Access, т. е. файл new_BD.mdb.

// Эта база данных будет пустой, т. е. не будет содержать ни одной таблицы.

// Наполнять базу данных таблицами можно будет впоследствии

// как из программного кода С# 2010, так и используя MS Access.

// В этом примере технология ADO.NET не использована

using System.Windows.Forms; // — добавили эту директиву для MessageBox

// Другие директивы using удалены, поскольку они не используются в данной программе

// Microsoft ADO Ext. 2.8 for DDL and Security

static void Main(string[] args)

ADOX.Catalog Каталог = new ADOX.Catalog));

Каталог.Create(«Provider=Microsoft.Jet.» + «OLEDB.4.0;Data Source=C:\\new_BD.mdb»);

MessageBox.Show(«База данных С:\\new_BD.mdb успешно создана»);

catch (System.Runtime.InteropServices.COMException Ex)

Далее чтобы во время выполнения программы не появлялось черное окно DOS, в пунктах меню Project | ConsoleApplicationl Properties на вкладке Application в скрывающемся списке Application type выберем Windows Forms Application. Чтобы был доступен объект MessageBox для вывода сообщений, добавим в проект еще одну DLL-библиотеку. Для этого, как и в предыдущем случае, укажем пункты меню Project | Add Reference и на вкладке .NET дважды щелкнем по ссылке System.Windows.Forms.dll, а в тексте программы добавим директиву:

Ключевое слово using используется для импортирования пространства имен, которое содержит класс MessageBox.

Программа работает следующим образом: создаем экземпляр класса ADOX.catalog, одна из его функций Create способна создавать базу данных, если на ее вход подать строку подключения. Заметим, что в строку подключения входит также и полный путь к создаваемой БД. Функция Create заключена в блоки try. catch, которые обрабатывают исключительные ситуации. После запуска этого приложения получим сообщение о создании базы данных (рис. 10.11).

Если же тут же запустим наше приложение еще раз, то получим сообщение о том, что такая база данных уже существует (рис. 10.12), поскольку БД new_BD.mdb только что создана.

Рис. 10.11. Сообщение о создании базы данных Рис. 10.12. База данных существует

Данное сообщение генерировалось обработчиком исключительной ситуации. Программный код этой программы можно посмотреть, открыв решение БДСоздание.sln в папке БДСоздание.

Пример 69. Запись структуры таблицы в пустую базу данных MS Access. Программная реализация подключения к БД

Теперь здесь и далее мы используем только самую современную технологию ADO .NET. Создадим программу, которая записывает структуру таблицы, т. е. «папку» таблицы, в существующую БД. В этой БД может еще не быть ни одной таблицы, т. е. БД может быть пустой. Либо в БД могут уже быть таблицы, но название новой таблицы должно быть уникальным.

Создадим базу данных new_BD.mdb в корневом каталоге логического диска С:, используя MS Access или программным путем, как это было показано в предыдущем разделе. Никакие таблицы в базе данных создавать не станем, т. е. будем иметь пустую БД. Теперь запустим Visual Studio 2010, затем выберем пункт меню New Project. Далее, поскольку для этого приложения нам не нужна экранная форма с ее элементами управления, укажем среди шаблонов Console Application С#. За напишем программный код, представленный в листинге 10.3.

Листинг 10.3. Создание таблицы в БД MS Access

// Программа записывает структуру таблицы в пустую базу, данных MS Access.

// Программная реализация подключения к БД. В этой БД может

// еще не быть ни одной таблицы, т. е. БД может быть пустой. Либо в БД

// могут уже быть таблицы, но название новой таблицы должно быть уникальным

using System.Windows.Forms; // — добавили эту директиву для MessageBox // Добавляем эту директиву для краткости выражений:

using ОлеДиБи = System.Data.OleDb;

// Другие директивы using удалены, поскольку они не используются в данной программе

static void Main(string[] args)

var Подключение = new ОлеДиБи.OleDbConnection(

// Создание экземпляра объекта класса Command с заданием SQL-запроса:

var Команда = new ОлеДиБи.OleDbCommand(«CREATE TABLE [» +

«БД телефонов] ([Номер п/п] counter, [ФИО] ch» + «аг(20), [Номер телефона] char(20))», Подключение);

try // Выполнение команды SQL:

MessageBox.Show(«Структура таблицы ‘БД телефонов’ записана пустую БД»);

catch (Exception Ситуация)

Чтобы работала функция MessageBox. Show, следует в текущий проект добавить ссылку на DLL-библиотеку. Для этого в пункте меню Project выберем команду Аdd Reference и на вкладке .NET дважды щелкнем на ссылке System.Windows.Forms.dll. Кроме того, используя пункты меню Project | ConsoleApplicationl Properties, на появившейся вкладке Application в раскрывающемся спи­ске Application type выберем тип приложения Windows Forms Application.

Как видно из текста программы, вначале создаем экземпляр класса Connection с указанием строки подключения. Теперь мы имеем возможность управлять этой строкой программно. Далее создаем экземпляр класса Command с заданием SQL-запроса. В этом запросе создаем (create) новую таблицу с именем БД телефонов с тремя полями: Номер п/п типа счетчик (counter), ФИО и Номер телефона. Здесь имя таблицы и имена полей заключены в квадратные скобки, поскольку они со­держат пробелы.

Чтобы выполнить эту SQL-команду, вызываем метод ExecuteNonQuery, кото­рый заключим в блоки try. . .catch для обработки исключительных ситуаций. Ес­ли SQL-запрос благополучно выполнился, то получаем сообщение: «Структура таблицы ‘БД телефонов’ записана в пустую БД». А если, например, таблица с таким именем уже имеется в базе данных, то управление передается блоку catch (пере­хват исключительной ситуации), и мы получаем сообщение о том, что такая табли­ца базы данных уже существует (рис. 10.13).

Рис. 10.13. Сообщение о существовании таблицы

Таким образом, в данной программе сначала организовано подключение Connection к БД через строку подключения и открытие подключения Open. Затем задание SQL-запроса в объекте Сommand и выполнение запроса функцией ExecuteNonQuery. Если связывание данных организовать программно, то добива­йся более высокой гибкости, когда, например, на стадии разработки неизвестно заранее, где (на каком диске, в какой папке) будет находиться БД.

Убедиться в работоспособности программы можно, открыв решение БдСоздТаблицы.slп в папке БдСоздТаблицы.

Пример 70. Добавление записей в таблицу базы данных MS Access

Совсем маленькую программу из предыдущего раздела можно использовать для выполнения любого запроса к базе данных. Например, модифицируем всего лишь одну строчку программного кода программы из предыдущего примера для добавления новой записи в таблицу БД. Для этого при создании экземпляра объекте Соmmand зададим SQL-запрос на вставку (insert) новой записи в таблицу БД.

Заметим, что в SQL-запросе мы сознательно обратились к таблице по имени [ бд телефонов], т. е. со строчной буквы, хотя надо с прописной. Дело в том, что в именах таблиц следует точно указывать регистр символа, поскольку их поиск ведется с учетом регистра (casesensitive search). Однако это не обязательно при на­личии только одной таблицы с таким именем, поскольку при этом используется поиск без учета регистра (caseinsensitive search).

Свойству Сonnection объекта класса Сommand следует дать ссылку на объект класса Сonnection:

Команда .Connection = Подключение;

Причем для добавления записи в таблицу БД такая ссылка обязательна в отличие предыдущего примера, где мы создавали новую таблицу в существующей БД. Программный код будет выглядеть так, как представлено в листинге 10.4.

Листинг 10.4. Добавление записей в таблицу базы данных MS Access

//Программа добавляет запись в таблицу базы данных MS Access. Для этого

//при создании экземпляра объекта Command задаем SQL-запрос

//на вставку (Insert) новой записи в таблицу базы данных

using System.Windows.Forms; // — добавили эту директиву для MessageBox

//Добавляем эту директиву для краткости выражений:

using ОлеДиБи = System.Data.OleDb;

//Другие директивы using удалены, поскольку они не используются в данной программе

static void Main(string[] args)

// с указанием строки подключения:

var Подключение = new ОлеДиБи.OleDbConnection(

// Создание экземпляра объекта Command с заданием SQL-запроса:

var Команда = new ОлеДиБи.OleDbCommand( «INSERT INTO [бд телефонов] (» +

«Фио, [номер телефона]) VALUES (‘Света-Х’, ‘521-61-41’)»);

// Для добавления записи в таблицу БД эта команда обязательна:

// Выполнение команды SQL:

MessageBox.Show(«В таблицу ‘БД телефонов’ добавлена запись»);

Часто, отлаживая программный код на Visual Studio С#, при работе с БД появ­ляется необходимость проверки работы программы, например, создалась ли таб­лица в БД, добавилась ли запись в таблице БД, правильно ли сформирован SQL-запрос. Не обязательно запускать MS Access, чтобы выполнить SQL-запрос или проверить правильность его синтаксиса. Это можно сделать в среде Visual Studio. Для этого в пункте меню View выбираем команду Server Explorer (Обозреватель баз данных), далее в списке подключений указываем полный путь к нужной БД. Затем, щелкая правой кнопкой мыши на значке нужной таблицы, в контекстном меню выбираем пункт Retrieve Data. При этом в панели инструментов (Toolbar) появляется значок SQL, после щелчка по этому значку (или нажатия комбинации клавиш <Ctrl>+<3>) получим окно SQL-запроса. В этом окне мы можем задавать SQL-запрос, а затем, например, щелкая правой кнопкой мыши, либо проверять его синтаксис, либо выполнять.

Убедиться в работоспособности программы можно, открыв решение БдДобавлЗаписи.sln в папке БдДобавлЗаписи.

Пример 71. Чтение всех записей из таблицы базы данных с помощью объектов классов Command, DataReader и элемента управления DataGridView

Покажем, как легко, очень малой кровью, можно вывести таблицу базы данных элемент управления DataGridView (сетка данных, т. е. таблица данных) с использованием тех же объектов из предыдущей программы классов Сommand и DataReader.

Для решения этой задачи запустим Visual Studio 2010, закажем новый проект New Project шаблона Windows Forms Application С#. Из панели Toolbox добавим в проектируемую форму элемент управления DataGridView и растянем его на всю форму. На вкладке Forml.cs напишем программный код, представленный в листинге 10.5. С ‘

Листинг 10.5. Чтение всех записей из таблицы БД

// Программа читает все записи из таблицы базы данных с помощью объектов

// Сommand, DataReader и элемента управления DataGridView

using System. Windows. Forms ;

// Добавляем эту директиву для краткости выражений:

using ОлеДиБи = System.Data.OleDb;

// Другие директивы using удалены, поскольку они не используются в данной программе

public partial class Form1 : Form

// Создаем объект Connection и передаем ему строку подключения:

var Подключение = new ОлеДиБи.OleDbConnection( «Data Source=\»C:\\vic.mdb\»;User » + «ID=Admin;Provider=\»Microsoft.Jet.OLEDB.4.0\»;»);

// Создаем объект Command, передавая ему SQL-команду

ОлеДиБи.OleDbCommand Команда = new ОлеДиБи.

OleDbCommand(«Select * From [БД телефонов]», Подключение);

ОлеДиБи.OleDbDataReader Читатель = Команда.

DataTable Таблица = new DataTable();

// Заполнение «шапки» таблицы

while (Читатель.Read() == true)

// Заполнение клеток (ячеек) таблицы

// Здесь три поля: 0, 1 и 2

Как видно из программы, она очень похожа на предыдущую. После выполне­ния SQL-команды создаем объект DataTable, который в конце программного кода задаем как источник (DataSource) для сетки данных dataGridView1. Заполняем «шапку» таблицы, т. е. названия колонок, методом Add.

Далее, как и в предыдущей программе, в цикле While заполняем ячейки табли­цы. Фрагмент работы программы показан на рис. 10.14.

Рис. 10.14. Отображение таблицы базы данных на элементе DataGridView

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

Одно из ключевых преимуществ использования объекта DataReader — это его скорость и небольшое использование памяти. Однако применение циклического считывания данных сводит эти преимущества на нет. Убедиться в работоспособности программы можно, открыв решение БдReaderGridView.sln в папке БдReaderGridView.

Пример 72. Чтение данных из БД в сетку данных DataGridView с использованием объектов классов Command, Adapter и DataSet

Рассмотрим пример чтения таблицы с помощью объекта Adapter из базы данных посредством выбора нужных данных и передачи их объекту DataSet. Очень удобно прочитать таблицу, записанную в DataSet, используя элемент управления DataGridView (сетка данных, т. е. таблица данных), указав в качестве источника данных для сетки DataGridView объект класса DataSet.

Поскольку нам нужен элемент управления DataGridView, мы создаем новый проект с экранной формой. Для этого, как обычно, запускаем Visual Studio 2010, заказываем новый проект New Project шаблона Windows Forms Application C#. Из панели Toolbox добавляем в форму элемент управления DataGridView растягиваем его на всю форму, как показано на рис. 10.15.

Рис. 10.15. Проектирование экранной формы

Далее пишем программный код, представленный в листинге 10.6.

Листинг 10.6. Чтение данных из БД в сетку данных DataGridView

//Программа читает из БД таблицу в сетку данных DataGridView //с использованием объектов класса Command, Adapter и DataSet using System.Data;

// Добавляем эту директиву для краткости выражений:

using ОлеДиБи = System.Data.OleDb;

// Другие директивы using удалены, поскольку они не используются в данной программе

public partial class Form1 : Form

this.Text = «Чтение таблицы из БД:»;

var Подключение = new ОлеДиБи.OleDbConnection( «Data Source=\»C:\\vic.mdb\»;User » + «ID=Admin;Provider=\»Microsoft.Jet.OLEDB.4.0\»;»);

var Команда = new ОлеДиБи.OleDbCommand(«Select * From [БД-телефонов]», Подключение); // var Команда = new ОлеДиБи.01eDbCommand(«SELECT * FRO» + // «M [БД телефонов] WHERE (фио LIKE ‘м%’)», Подключение);

// Создаем объект Adapter и выполняем SQL-запрос

var Адаптер = new ОлеДиБи.OleDbDataAdapter(Команда);

// Создаем объект класса DataSet

DataSet НаборДанных = new DataSet();

// Заполняем DataSet результатом SQL-запроса

Адаптер.Fill(НаборДанных, «БД телефонов»);

// Содержимое DataSet в виде строки XML для отладки:

string CтpoкaXML = НаборДанных.GetXml();

// Указываем источник данных для сетки данных:

// Указываем имя таблицы в наборе данных:

dataGridViewl.DataMember = «БД телефонов»;

Как видно из текста программы, вначале создаем объект класса Connection, передавая строку подключения. Затем, создавая объект класса Сommand, задаем SQL — команду выбора всех записей из таблицы БД телефонов. Здесь мы можем задать любую SQL-команду, в комментарии приведен пример такой команды, которая содержит select и like: выбрать из таблицы БД телефонов только записи, в которых поле ФИО начинается на «м«. Оператор like используется для поиска по шаблону (pattern matching) вместе с символами универсальной подстановки (метасимволами) «звездочка» (*) и «знак вопроса» (?). Строка шаблона заключена в одиночные кавычки. Заметим также, что большинство баз данных использует символ «%» вместо значка «*» в like -выражениях.

Далее при создании объекта класса Adapter выполняем SQL-команду и при выполнении метода Fill заполняем объект класса DataSet таблицей, полученной в результате SQL-запроса. Затем указываем в качестве источника данных для сетки данных dataGridView1 объект класса DataSet. Этого оказывается достаточно вывода на экран результатов SQL-запроса (рис. 10.16).

Рис. 10.16. Вывод результата SQL-запроса

Так же как и при использовании объекта класса DataReader в предыдущем ере, в полученной таблице мы можем сортировать записи по любой из коло-Можем редактировать (изменять) содержание ячеек, но в базу данных эти из-ния не попадут (сохранения не будет).

Заметим, что здесь с помощью визуального проектирования выполнено только перетаскивание в форму сетки данных DataGridView, остальное сделано программно, что обеспечивает большую гибкость программы.

Убедиться в работоспособности программы можно, открыв решение БдАдаптерGridView.sln в папке БдАдаптерGridView.

Пример 73. Обновление записей в таблице базы данных MS Access

Одним из четырех действий над данными в БД(Select, Insert, Update и Delete) является модификация (Update, обновление) данных. Автор поставил задачу написать маленькую программу для обновления записей в таблице базы данных, но с большим удобством (гибкостью) управления программным кодом.

Рассматриваемая в данном примере программа имеет форму, сетку данных —DataGridView, в которую из базы данных читается таблица при нажатии кнопки Читать из БД. Пользователь имеет возможность редактировать данные в этой таблице, после чего, нажав кнопку Сохранить в БД, данные в базе данных будут модифицированы, т. е. заменены новыми.

Для написания этой программы запускаем Visual Studio 2010, заказываем но­вый проект New Project шаблона Windows Forms Application C#. Из панели Toolbox добавляем в форму элемент управления DataGridView и две командные кнопки. Программный код программы представлен в листинге 10.7.

Листинг 10.7. Обновление записей в таблице базы данных MS Access

// Программа обновляет записи (Update) в таблице базы данных MS Access

using System. Windows . Forms ;

// Добавляем эту директиву для краткости выражений:

using ОлеДиБи = System.Data.OleDb;

// другие директивы using удалены, поскольку они не используются в данной программе

public partial class Form1 : Form

ОлеДиБи.OleDbConnection Подключение = new ОлеДиБи. 01eDbConnection( // Строка подключения:

«Data Source=\»C:\\vic.mdb\»;User » + «ID=Admin;Provider=\»Microsoft.Jet.OLEDB.4.0\»;»);

ОлеДиБи.OleDbCommand Команда = new ОлеДиБи.OleDbCommand();

Button1.Text = «Читать из БД»; button1.Tablndex = 0;

button2.Text = «Сохранить в БД»;

private void button1_Click(object sender, System.EventArgs e)

НаборДанных = new DataSet();

if (Подключение.State == ConnectionState.Closed) Подключение.Open();

Адаптер = new ОлеДиБи. OleDbDataAdapter ( «Select * From [БД телефонов]», Подключение);

// Заполняем DataSet результатом SQL-запроса

Адаптер.Fill(НаборДанных, «БД телефонов»);

// Содержимое DataSet в виде строки XML для отладки:

string СтрокаХML = НаборДанных.GetXml();

// Указываем источник данных для сетки данных:

// Указываем имя таблицы в наборе данных:

dataGridView1.DataMember = «БД телефонов»;

private void button2_Click(object sender, System.EventArgs e)

Команда.CommandText = «UPDATE [БД телефонов] SET [Ho» +

«мер телефона] = ?, ФИО = ? WHERE ([Номер п/п] = ?)»;

// Имя, тип и длина параметра

Команда.Parameters.Add(«Номер телефона», ОлеДиБи.OleDbType.VarWChar,

50, «Номер телефона»);

Команда.Parameters.Add(«ФИО», ОлеДиБи.OleDbType.VarWChar, 50, «ФИО»);

Команда. Parameters. Add (new ОлеДиБи.OleDbParameter(«Original_HoMep_n_n», ОлеДиБи.OleDbType.Integer, 0, System.Data.ParameterDirection. Input, false, (byte)0, (byte)0, «Номер п/п», System.Data.DataRowVersion.Original, null));

int kol = Адаптер.Update(НаборДанных, «БД телефонов»); MessageBox.Show(«Обновлено » + kol + » записей»);

catch (Exception Ситуация)

Как видно, мы имеем две процедуры обработки событий: щелчок на кнопке Читать из БД и щелчок на кнопке Сохранить в БД. Чтобы объекты классов DataSet, DataAdapter, Connection и Command были видны в этих трех процедурах, объявляем эти объекты внешними внутри класса Form1.

При программировании чтения из базы данных вначале с помощью SQL-запpoca мы выбрали все записи из таблицы (Select * From [БД телефонов]) и с помощью объекта класса Adapter поместили в набор данных DataSet. А затем указали объект класса DataSet в качестве источника (DataSource) для сетки данных DataGridview1. Фрагмент работы программы после чтения из базы данных пред­ставлен на рис. 10.17.

Рис. 10.17. Фрагмент работы программы обновления данных

Представляет интерес программирование модификации записей базы данных. Эта возможность запрограммирована при обработке события «щелчок мышью на кнопке» Сохранить в БД. Здесь свойству CommandText присвоено значение текста SQL-запроса. В качестве заменителей параметров используются вопросительные знаки. Как видно, в данном SQL-запросе имеют место три вопросительных знака. Им соответствуют три параметра, которые должны указываться именно в порядке следования вопросительных знаков. Эти параметры задаем с использованием мето­да COMMAND.Parameters. Add. Здесь указываем имя поля (например, «Номер телефо­на«, тип, длину параметра и значение по умолчанию. Заметим, что третий параметр («Номер п/п«) задается как новый, поскольку он не должен подлежать редактированию со стороны пользователя, а устанавливаться автоматически, независимо от пользователя.

Далее в блоке try. . .catch вызываем непосредственно метод Update, который возвращает количество (kol) обновленных записей. В случае неудачного обновления обрабатывается исключительная ситуация Exception, объект Exception обеспечивает соответствующее сообщение о недоразумении.

Убедиться в работоспособности программы можно, открыв решение БдUpdate.sln в папке БдUpdate.

Пример 74. Удаление записей из таблицы базы данных с использованием SQL-запроса и объекта класса Command

Можно также удалять записи (строки из таблицы БД), формируя в программ соде соответствующий SQL-запрос, передаваемый в объект класса Сommand, но объект Сommand — обеспечивает привязку SQL-выражения к соединению с базой данных. Напишем самый простой пример такой программы, для этого запустим Visual Studio 2010 и закажем новый проект New Project. В данном случае экранная форма нам не нужна, поэтому выберем, как и в некоторых предыдущих примерах, шаблон Console Application С#. Для того чтобы во время выполнения данной программы не видеть черного DOS-экрана, в меню Project выберем команду ConsoleApplication1 Properties и на вкладке Application укажем в раскрывающемся списке Application type тип приложения Windows s Application. Чтобы иметь доступ к функции MessageBox.Show, добавим к проекту ссылку на динамическую библиотеку Forms.dll. Для этого выберем пункты Project | Add Reference и на вкладке .NET дважды щелкнем по ссылке на библиотеку System.Windows.Forms.dll. Отметим, что при этом в окне Sulution Explorer среди ссылок References появится соответствующая этой библиотеке ссылка.

Далее напишем программный код из листинга 10.8.

Листинг 10.8. Удаление записей из таблицы БД

//Программа удаляет запись из таблицы БД с использованием SQL-запроса и обьекта класса Command

System.Windows.Forms; // — добавили эту директиву для MessageBox

//Добавляем эту директиву для краткости выражений:

Using ОлеДиБи = System.Data.OleDb;

// Другие директивы using удалены, поскольку они не используются в данной программе

static void Main(string[] args)

var Подключение = new ОлеДиБи.

OleDbConnection( // Строка подключения:

// Создаем объект класса Command, передавая ему SQL-команду

var Команда = new ОлеДиБи.OleDbCommand(

«Delete * From [БД телефонов] Where » + «ФИО Like ‘Vi%'», Подключение);

// Выполнение команды SQL

int i = Команда. ExecuteNonQuery ();

// i — количество удаленных записей

if (i > 0) MessageBox.Show(

«Записи, содержащие в поле ФИО фрагмент ‘Vi*’, удалены»);

if (i == 0) MessageBox.Show(

«Запись, содержащая в поле ФИО фрагмент ‘Vi*’, не найдена»);

Здесь при создании объекта класса Command задан SQL-запрос на удаление (Delete) всех записей, содержащий в поле ФИО фрагмент текста «Vi*«, причем строчные и прописные буквы являются равнозначными, т. е. будут удалены записи, содержащие «Vi*«, «vi*», «VI*» и прочие комбинации. Таким образом, поиск записей ведется без учета регистра (caseinsensitive search).

Замечу, что здесь для выполнения команды SQL использован метод ExecuteNonQuery. Он возвращает в переменную i количество удаленных записей. Если i = 0, значит, записи с таким контекстом не найдены и ни одна запись не удалена.

Убедиться в работоспособности программы можно, открыв решение БдУдаленЗаписи.sln в папке БдУдаленЗаписи.

Читать:
Movavi video suite 22 как пользоваться

Похожие статьи