русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Подключение с базе данных и выполнение SQL-запросов


Дата добавления: 2015-07-04; просмотров: 1456; Нарушение авторских прав


1. Установление соединения с БД.

Добавим в класс главного окна переменные и функцию (файл mainwindow.h, секция private):

// база данных

QSqlDatabase db;

// модель данных

QSqlTableModel *model;

// функция для подключения к базе данных

bool createConnection();

 

Создадим функцию в файле mainwindow.cpp для реализации подключения к БД.

bool MainWindow::createConnection()

{

return true;

}

Подключим ее в конструкторе (после ui->setupUi(this);):

createConnection();

Весь дальнейший код пишите внутри функции createConnection().

Для подключения к базе данных надо указать название SQL-драйвера, например:

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");

Затем можно указать имя сервера, название базы данных, имя пользователя и пароль:

// db.setHostName("localhost"); // или, например, "my1.server.ru"

// db.setDatabaseName("mydb1");

// db.setUserName("root");

// db.setPassword("mypassword");

Все эти параметры можем опустить.

Вместо этого напишем:

db.setDatabaseName(":memory:");

Это важно. Предопределённое имя ":memory:" позволяет размещать временную базу данных в оперативной памяти.

 

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

if (!db.open()) {

QMessageBox::critical(0, qApp->tr("Cannot open database"),

qApp->tr("Unable to establish a database connection.\n"

"This example needs SQLite support. Please read "

"the Qt SQL driver documentation for information how "

"to build it.\n\n"

"Click Cancel to exit."), QMessageBox::Cancel);



return false;

}

 


2. Первичное заполнение БД.

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

Если подключение установлено, то можно выполнить любой SQL-запрос, например, создадим таблицу

if (db.tables().empty()) //проверка на наличие таблиц

{

//QMessageBox::critical(0, tr("Error"), tr("Database is empty"));

//создание таблицы:

QSqlQuery query;

query.exec("create table person (id int primary key, "

"firstname varchar(20), lastname varchar(20))");

//заполнение таблицы:

query.exec("insert into person values(1, 'Alina', 'Bichenko')");

query.exec("insert into person values(2, 'Kate', 'Mikova')");

query.exec("insert into person values(3, 'Olga', 'Skalskaya')");

query.exec("insert into person values(4, 'Alexander', 'Panchenko')");

query.exec("insert into person values(5, 'Victorya', 'Silivina')");

query.exec("insert into person values(6, 'July', 'Tokmakova')");

}

Данные можно добавлять и по-другому:

query.prepare("INSERT INTO person (id, firstname, lastname, ball) "

"VALUES (?, ?, ?, ?)");

query.addBindValue(7);

query.addBindValue("Bart");

query.addBindValue("Simpson");

query.addBindValue(1);

query.exec();

 

4. Вывод содержимого таблицы на экран.

Перейдите в режим визуального редактирования (дважды щелкнув по mainwindow.ui).

Перетащите элемент Table View на форму (рис. 8.4).

 

Рисунок 8.4 – Редактирование главного окна

 

Вернитесь в mainwindow.cpp (нажав на либо ).

Свяжем модель данных с таблицей на форме:

// объявляем модель данных

model = new QSqlTableModel(this);

// указываем таблицу из БД

model->setTable("person");

// заносим данные в модель

// если удачно

if(model->select())

{

// передаем данные из модели в tableView

ui->tableView->setModel(model);

// устанавливаем высоту строки по тексту

ui->tableView->resizeRowsToContents();

// шапка для первой колонки

model->setHeaderData(0, Qt::Horizontal, tr("ID"));

// шапка для второй колонки

model->setHeaderData(1, Qt::Horizontal, tr("Имя"));

// передача управления элементу tableView

ui->tableView->setFocus();

}

Запустите и протестируйте приложение.

 

5. Компоновка и отображение.

Используя (в режиме дизайна) компоновку , добейтесь фиксированного расположения элементов на экране.

Перейдите к свойствам элемента tableView и найдите horizontalHeaderStretchLastSection и поставьте “птичку” – это позволит автоматически растянуть колонки по всей длине tableView.

Изменените отображения названий всех столбцов, например:

model->setHeaderData(2, Qt::Horizontal, QObject::tr("Фамилия"));

Запустите и протестируйте приложение.

 

6. Дополнительная информация.

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

- OnRowChange– производит запись данных, как только пользователь перейдет к другой строке таблицы.

- OnFieldChange– производит запись после того, как пользователь перейдет к другой ячейке таблицы.

- OnManualSubmit– записывает данные по вызову слота submitAll(). Если вызывается слот revertAll(), то данные возвращаются в исходное состояние.

В программном коде это выглядит вот так:

model->setEditStrategy(QSqlTableModel::OnFieldChange);

Если при выполнении запроса возникла ошибка, то метод lastError() позволяет вывести на экран её описание:

if (!query.isActive()) QMessageBox::warning(this, tr("Database Error"), query.lastError().text());


7. Самостоятельная работа.

7.0. Сделайте так, чтобы в БД заносились данные о студентах, что выполняют эту работу, т. е. о вас.

 

7.1. Сделайте так, чтобы таблица сохранялась на компьютере, а не хранилась в оперативной памяти.

 

7.2. Измените отображаемые названия для столбцов таблицы на: №, Имя, Фамилия.

 

7.3. Добавьте в таблицу столбец «Средний балл». Отсортируйте таблицу по этому показателю.

 

7.4. Сделайте столбец с первичным ключом невидимым (с помощью метода QTableView).

 

7.5. Измените размеры окна, добавьте кнопку «Выход», реализуйте эту возможность.

 

7.6. Добавьте столбец «Дата рождения». Отсортируйте таблицу по возрасту.

 

7.7. Создайте оболочку для работы с БД (см. п. 8):

– должна быть возможность перехода к следующей (Next), предыдущей (Previous), первой (First) и последней (Last) записей таблицы;

– название таблицы должно отображаться в заголовке окна;

– все поля должны быть отображены на форме;

– для поля «Дата рождения» по нажатию на него должен появляться календарик;

– должна быть возможность прямо с формы добавить нового студента.

 

Рисунок 8.5 – Пример для работы с другой таблицой

8. Навигация по записям в таблице.

8.1. Mapper.

Для того чтобы перемещаться по записям в таблице необходимо воспользоваться классом QDataWidgetMapper, создав его описание в классе (файл mainwindow.h, секция private):

QDataWidgetMapper *mapper;

там же его необходимо подключить:

#include <QDataWidgetMapper>

и упомянуть его в конструкторе (mainwindow.cpp, функция createConnection()), связав с моделью:

mapper = new QDataWidgetMapper(this);

mapper->setModel(model);

Перейдите в режим визуального редактирования (дважды щелкнув по mainwindow.ui).

Разбейте компоновку и уменьшите таблицу.

Перетащите элементы Line Edit и Label на форму. С помощью клавиши Ctrl выделите оба виджета и скомпонуйте их по горизонтали . С помощью окна свойств (рис. 8.6) измените имя Line Edit с lineEdit на nameEdit.

Измените свойство text у Label на «Имя».

 

Рисунок 8.6 – Инспектор свойст

 

Вернитесь в mainwindow.cpp, допишите:

mapper->addMapping(ui->nameEdit, model->fieldIndex("firstname"));

mapper->toFirst();

Обратите внимание – в качестве примера связь установлена лишь с одним полем «Имя», связь с другими полями – установите самостоятельно.

Запустите и протестируйте приложение.

 

8.2. Кнопки навигации.

Перетащите элемент PushButton на форму, задайте ему имя Next_Button, измените отображаемый текст на клавише на «Вперед», либо «Следующий», либо «>>». Нажмите на клавише правой кнопкой мыши, выберите «Перейти к слоту…» (рис. 8.7).

 

Рисунок 8.7 – Создание реакции на нажатие клавиши

 

В открывшемся диалоговом окне выберите сигнал clicked() и нажмите ОК.

В появившейся функции напишите:

mapper->toNext();

Для остальных кнопок – аналогично: toPrevious(), toFirst(), toLast().

Для кнопки удаления:

model->removeRow(mapper->currentIndex());

model->select(); mapper->setModel(model);

 



<== предыдущая лекция | следующая лекция ==>
Подготовка к подключению БД | Реляционные БД в Qt


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.706 сек.