Qt и SQL. Программирование баз данных

Содержание

Слайд 2

А для того, чтобы работать с классами этого модуля, необходимо включить

А для того, чтобы работать с классами этого модуля, необходимо включить

заголовочный метафайл QtSql.
Для высылки запросов используется класс QSqlQuery.
Для создания таблицы используется оператор CREATE TABLE, в котором указываются имена столбцов таблицы, их тип, а также задается первичный ключ:
CREATE TABLE addressbook (
number INTEGER PRIMARY KEY NOT NULL,
name VARCHAR(15),
phone VARCHAR(12),
email VARCHAR(15)
);
Слайд 3

После создания таблицы можно добавлять данные. Для этого SQL предоставляет оператор

После создания таблицы можно добавлять данные. Для этого SQL предоставляет оператор

вставки insert into. Сразу после названия таблицы нужно указать в скобках имена столбцов, в которые будут заноситься данные.
Сами данные указываются после ключевого слова values.
INSERT INTO addressbook (number, name, phone, email)
VALUES(1, 'Piggy', '+49 631322187', 'piggy@mega.de');
INSERT INTO addressbook (number, name, phone, email)
VALUES(2, 'Kermit', '+49 631322181', 'kermit@mega.de');
Слайд 4

Составной оператор select ... from ... where осуществляет операции выборки и

Составной оператор select ... from ... where осуществляет операции выборки и

проекции. Выборка соответствует выбору строк, а проекция — выбору столбцов. Этот оператор возвращает таблицу, созданную согласно заданным критериям.
Ключевое слово SELECT является оператором для проведения проекции, то есть в нем указываются столбцы, которые должны стать ответом на запрос. Если указать после SELECT знак *, то результирующая таблица будет содержать все столбцы таблицы, к которой был адресован запрос. Указание конкретных имен столбцов устраняет в ответе все остальные.
Слайд 5

Ключевое слово FROM задает таблицу, к которой адресован запрос. Ключевое слово

Ключевое слово FROM задает таблицу, к которой адресован запрос.
Ключевое слово WHERE

является оператором выборки. Выборка осуществляется согласно условиям, указанным сразу после оператора.
Например, для получения адреса электронной почты мисс Piggy нужно сделать следующее:
SELECT email
FROM addressbook
WHERE name = 'Piggy';
Слайд 6

Для изменения данных таблицы используется составной оператор UPDATE ... SET. После

Для изменения данных таблицы используется составной оператор UPDATE ... SET. После

названия таблицы в операторе SET указывается название столбца (или столбцов, через запятую), в который будет заноситься нужное значение. Изменение данных производится в строках, удовлетворяющих условию, поставленному в ключевом слове WHERE.
В показанном ниже примере производится замена адреса электронной почты мисс Piggy с piggy@mega.de на piggy@supermega.de:
UPDATE addressbook
SET email = 'piggy@supermega.de'
WHERE name = 'Piggy';
Слайд 7

Удаление строк из таблицы производится при помощи оператора DELETE ... FROM.

Удаление строк из таблицы производится при помощи оператора DELETE ... FROM.

После ключевого слова WHERE следует критерий, согласно которому производится удаление строк. Например, удалить адрес мисс Piggy из таблицы можно следующим образом:
DELETE FROM addressbook
WHERE name = 'Piggy';
Слайд 8

Классы модуля QtSql разделяются на три уровня: Уровень драйверов. Программный уровень.

Классы модуля QtSql разделяются на три уровня:
Уровень драйверов.
Программный уровень.
Уровень пользовательского интерфейса.
К

первому уровню относятся классы для получения данных на физическом уровне. Это такие классы, как: QSqlDriver, QSqlDriverCreator, QSqlDriverCreatorBase, QSqlDriverPlugin и QSqlResult
Они необходимы для создания собственного драйвера для менеджера базы данных. Но в большинстве случаев все ограничивается использованием конкретной СУБД , поддерживаемой Qt.
Слайд 9

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

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

К классам этого уровня относятся следующие классы: QSqlDatabase, QSqlQuery, QSqlError, QSqlField, QSqlIndex и QSqlRecord.
Третий уровень предоставляет модели для отображения результатов запросов в представлениях интервью. К этим классам относятся: QSqlQueryModel, QSqlTableModel и QSqlRelationalTableModel.
Слайд 10

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

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

этого вызывается статический метод QSqlDatabase::addDatabase().
В него нужно передать строку, обозначающую идентификатор драйвера СУБД.

Для того чтобы подключиться к базе данных, потребуется четыре следующих параметра:
имя базы данных — передается в метод QSqlDatabase:: setDatabaseName();
имя пользователя, желающего к ней подключиться, — передается в метод QSqlDatabase::setUserName();
имя компьютера, на котором размещена база данных, — передается в метод QSqlDatabase::setHostName();
пароль — передается в метод QSqlDatabase::setPassword().

Слайд 11

Слайд 12

Методы должны вызываться из объекта, созданного с помощью статического метода QSqlDatabase::addDatabase().

Методы должны вызываться из объекта, созданного с помощью статического метода QSqlDatabase::addDatabase().
Само

соединение осуществляется методом QSqlDatabase::open(). Значение, возвращаемое им, рекомендуется проверять. В случае возникновения ошибки, информацию о ней можно получить с помощью метода QSqlDatabase::lastError(), который возвращает объект класса QSqlError.
Его содержимое можно вывести на экран с помощью qDebug(). Если у вас возникла необходимость получить строку с ошибкой, то нужно вызвать из объекта класса QSqlError метод text().
Слайд 13

Для исполнения команд SQL, после установления соединения, можно использовать класс QSqlQuery.

Для исполнения команд SQL, после установления соединения, можно использовать класс QSqlQuery.


Запросы (команды) оформляются в виде обычной строки, которая передается в конструктор или в метод QSqlQuery::exec().
В случае конструктора, запуск команды будет производиться автоматически, при создании объекта.
Слайд 14

Слайд 15

Класс QSqlQuery предоставляет возможность навигации. Например, после выполнения запроса SELECT можно:

Класс QSqlQuery предоставляет возможность навигации. Например, после выполнения запроса SELECT можно:
С

помощью метода next() перемещаться на следующую строку данных,
Методом previous() перемещаться на предыдущую строку данных.
При помощи методов first() и last() можно установить первую и последнюю строку данных соответственно.
Метод seek() устанавливает строку данных по указанному целочисленному индексу в его параметре.
Количество строк данных можно получить вызовом метода size().
Слайд 16

Дополнительные сложности возникают с запросом INSERT. Дело в том, что в

Дополнительные сложности возникают с запросом INSERT. Дело в том, что в

запрос нужно внедрять данные. Для достижения этого можно воспользоваться двумя методами: prepare() и bindValue(). В методе prepare() мы задаем шаблон, данные в который подставляются методами bindValue(). Например:
query.prepare("INSERT INTO addressbook (number, name, phone, email) VALUES(:number, :name, :phone, :email);");
query.bindValue (" :number", "1");
query.bindValue(":name", "Piggy");
query.bindValue(":phone", " + 49 631322187");
query.bindValue(":email", "piggy@mega.de");
Слайд 17

Также можно воспользоваться вариантом использования безымянных параметров: query.prepare("INSERT INTO addressbook (number,

Также можно воспользоваться вариантом использования безымянных параметров:
query.prepare("INSERT INTO addressbook (number, name,

phone, email) VALUES(?, ?, ?, ?);");
query.bindValue("1");
query.bindValue("Piggy");
query.bindValue("+ 49 631322187");
query.bindValue("piggy@mega.de");
Слайд 18

В качестве третьего варианта — можно воспользоваться классом QString, в частности

В качестве третьего варианта — можно воспользоваться классом QString, в частности

методом QString::arg(), с помощью которого можно произвести подстановку значений данных.
Слайд 19

Слайд 20

Слайд 21

В случае удачного соединения с базой данных с помощью createConnection() создается

В случае удачного соединения с базой данных с помощью createConnection() создается

строка, содержащая команду SQL для создания таблицы.
Эта строка передается в метод exec() объекта класса QSqlQuery. Если создать таблицу не удается, то на консоль будет выведено предупреждающее сообщение.
Ввиду того, что в таблицу будет внесена не одна строка, в строковой переменной strF при помощи символов спецификации определяется шаблон для команды INSERT. Вызовы методов arg() класса QString подставляют нужные значения используя шаблон.
Слайд 22

Затем, когда база данных создана и все данные были внесены в

Затем, когда база данных создана и все данные были внесены в

таблицу, выполняется запрос SELECT, помещающий строки и столбцы таблицы в объект query.
Вывод значений таблицы на консоль производится в цикле. При первом вызове метода next() этот объект будет указывать на самую первую строку таблицы.
Последующие вызовы приведут к перемещению указателя на следующие строки. В том случае, если записей больше нет, метод next() вернет false, что приведет к выходу из цикла.
Слайд 23

Для получения результата запроса следует вызвать метод QSqlQuery::value(), в котором необходимо

Для получения результата запроса следует вызвать метод QSqlQuery::value(), в котором необходимо

передать номер столбца. Для этого мы воспользуемся методом record().
Этот метод возвращает объект класса QSqlRecord, который содержит информацию, относящуюся к запросу SELECT.
С его помощью, вызовом метода QSqlRecord::indexOf(), мы получаем индекс столбца.
Слайд 24

Метод value() возвращает значения типа QVariant. QVariant — это специальный класс,

Метод value() возвращает значения типа QVariant. QVariant — это специальный класс,

объекты которого могут содержать в себе значения разных типов.
Поэтому, в нашем примере, полученное значение нужно преобразовать к требуемому типу, воспользовавшись методами QVariant::toInt() и QVariant::toString().
Слайд 25

Модуль QtSql поддерживает концепцию Интервью, самый простой способ отобразить данные таблицы.

Модуль QtSql поддерживает концепцию Интервью, самый простой способ отобразить данные таблицы.

Здесь не потребуется цикла для прохождения по строкам таблицы.
Слайд 26

После соединения с базой данных, проводимого с помощью функции createConnection(), создается

После соединения с базой данных, проводимого с помощью функции createConnection(),
создается

объект табличного представления QTableView и объект табличной модели QSqlTableModel. Вызовом метода setTable() мы устанавливаем актуальную базу в модели. Вызов метода select() производит заполнение данными.
вызовом метода setEditStrategy() устанавливается стратегия редактирования SqlTableModel::OnFieldChange. Теперь данные нашей модели можно изменять после двойного щелчка на ячейке. В завершение мы устанавливаем модель в представлении вызовом метода setModel().
Слайд 27

Класс QSqlTableModel предоставляет три стратегии редактирования, которые устанавливаются с помощью метода

Класс QSqlTableModel предоставляет три стратегии редактирования, которые устанавливаются с помощью метода

setEditStrategy():
onRowChange — производит запись данных, как только пользователь перейдет к другой строке таблицы;
onFieldChange — производит запись данных после того, как пользователь перейдет к другой ячейке таблицы;
OnManualSubmit —записывает данные по вызову слота submitAl(). Если вызывается слот revertAll(), то данные возвращаются в исходное состояние.
Слайд 28

Если вам понадобится произвести отображение данных какого-либо конкретного опроса SELECT, то

Если вам понадобится произвести отображение данных какого-либо конкретного опроса SELECT, то

для этого целесообразнее будет воспользоваться другим классом SQL-моделей — классом QSqlQueryModel.
Листинг ниже иллюстрирует отображение только электронных адресов и телефонных номеров всех контактов с именем Piggy. В нашем случае он будет всего лишь один.