- •Аннотация к разделу
- •Теоритические принципы создания приложений бд
- •Основные задачи и сложности организации работы с бд
- •Программный (встроенный) sql
- •Статический sql
- •Динамический sql
- •Интерфейсы программирования приложений бд (api)
- •Интерфейс odbc
- •Механизм использования бд, применяемый в современных графических средствах разработки
- •Создание приложения, использующего бд Аннотация к подразделу
- •Настройка источников данных odbCвwindows
- •Базовые сведения о Qt
- •Введение
- •Модули Qt
- •Собственная система сборки Qt
- •Сигналы и слоты
- •Небольшой пример использования сигналов и слотов
- •Литература по Qt
- •Программный уровень
- •Уровень пользовательского интерфейса
- •Операции с бд
- •Соединение с бд
- •Выполнение запросов выборки и возврат результатов
- •Выполнение запросов вставки, обновления и удаления
- •Использование параметризованных запросов
- •Выполнение транзакций
- •Связь данных с пользовательским интерфейсом
- •Использование классов – моделей данных sql.
- •Отображение результата запроса выборки в таблице
- •Отображение и редактирование данных таблиц
- •Отображение и редактирование данных таблиц с использованием подстановки для внешних ключей
- •Связь элементов данных с обычными виджетами
- •Настройка собственной модели данных
Программный уровень
Классы программного уровня обеспечивают доступ к базам данных на уровне клиентского кода. Основные классы данного уровня:
QSqlDatabase– используется для подключения к БД;
QSqlQuery– обеспечивает взаимодействие с БД.
Дополнительные классы: QSqlError,QSqlField,QSqlIndexиQSqlRecord.
Уровень пользовательского интерфейса
Классы уровня пользовательского интерфейса обеспечивают связь данных из БД с виджетами, предназначенными для представления информации. Он включает классы: QSqlQueryModel,QSqlTableModelиQSqlRelationalTableModel, созданные для работы с подсистемойQt, называемой «Модель-представление» (англ.Model/view Framework, также наз. «Интервью»), архитектура которой представлена нарисунок 0.
Рисунок 0 – Архитектура подсистемы «Модель-представление»
|
Модель(Model) взаимодействует систочником данных(Data), предоставляя интерфейс для других компонентов в архитектуре. Характер связи зависит от типаисточника данных, и путиреализации модели. Представление(View) извлекает элементы данных изисточника данныхчерезмодельи отображает их в определенном виде. Делегат(Delegate) отображает отдельные элементы данных и определяет способ их редактирования. |
«Модель-представление» позволяет отделить способ хранения данных от их представления пользователю.
Операции с бд
Соединение с бд
Класс QSqlDatabaseобеспечивает интерфейс для получения доступа к БД через подключение. ЭкземплярклассаQSQlDatabaseпредставляет в программе подключение к БД.
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("borey");
db.setUserName("user");
db.setPassword("password");
bool ok = db.open();
Для создания подключения вызывается статическая функцияaddDatabase(). Ей передается драйвер или тип драйвера.
Как только объект QSqlDatabase создан, установить параметры подключения можно с помощью функций:setDatabaseName(),setUserName(),setPassword(),setHostName(),setPort()иsetConnectOptions(). Далее необходимо вызвать функциюopen() для открытия подключения.
Выполнение запросов выборки и возврат результатов
Для выполнения запросов выборки можно просто создать объекттипаQSqlQueryи вызвать функциюQSqlQuery::exec(), например:
QSqlQuery query;
query.exec("SELECT name, salary FROM employee "
"WHERE salary > 50000");
while (query.next())
{
QString name = query.value(0).toString();
int salary = query.value(1).toInt();
qDebug() << name << salary;
}
В конструкторклассаQSqlQueryдополнительно можно передать объектQSqlDatabase, для указания, какое конкретно подключение использовать при выполнении запроса. В примере выше мы не указывали подключение, используя таким образом подключение по умолчанию.
QSqlQueryобеспечивает доступ к результирующему множеству записей. После вызоваexec(), внутренний указательQSqlQueryрасполагается на позиции перед первой записью. Необходимо вызвать QSqlQuery::next() для продвидения к первой записи, затем опятьnext() несколько раз для получения доступа к записям, пока функцияnext() не вернетfalse.
Функция QSqlQuery::value() возвращает значение поля текущей записи. Поля пронумерованы, начиная с нуля. QSqlQuery::value() возвращает тип QVariant, тип, который может хранить разные типы данныхC++ иQt, например:QStringилиQByteArray. Если БД поддерживает такую возможность, мы можем вызвать QSqlQuery::size() для определения количества результирующих записей запроса.