Код программы базы данных

Если Вы совсем не знаете что такое SQL — то перед чтением первой части статьи стоит посмотреть соответствующую литературу (ссылки внизу страницы). Первая и третья части рассчитаны на читателя, который уже знает что такое база данных, но хочет узнать как их использовать в своих программах, написанных на С++ с использованием библиотеки Qt.

Паттерн Facade является одним из наиболее часто используемых — многие применяют его, но не знают об этом. Графический интерфейс приложения из третьей части статьи создаётся с помощью Qt Designer, если Вы никогда им пользовались — ознакомьтесь с моей предыдущей статьей.

1 Библиотека Qt и базы данных

Некоторые товарищи уверены, что базы данных нужны только в крупных проектах, однако, это не так. Вы, например, можете использовать БД, уже в том случае, если необходимо сохранять какую-либо информацию между запусками программы (вместо .ini файлов и т.п.). Использование БД более безопасно и надёжно, чем написание своих велосипедов.

Библиотека Qt позволяет работать с различными базами данных, в том числе Oracle DB, MySQL, SQLite. В примерах статьи описана работа с SQLite, однако, от работы с другими базами она отличается разве что подключением (ну и сами базы, конечно, тоже отличаются, но Qt тут не причём). Если содержимое раздела будет не совсем понятно — не расстраивайтесь, будет третий раздел и будут примеры, которые помогут разобраться.

Система регистрации и авторизации на PHP и MySQL базы данных

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

Кроме того, необходимо подключить заголовочный файл для работы с SQL:

Перед началом работы с базой необходимо активизировать соответствующий драйвер, это делается статическим методом QSqlDatabase::addDatabase, который принимает строку, определяющую тип базы (QSQLITE/QMYSQL/…). Полученный методом QSqlDatabase::addDatabase экземпляр класса QSqlDatabase, используется для подключения к базе данных, при этом должно быть установлено имя базы (методом QSqlDatabase::setDatabaseName), а также, возможно хост (QSqlDatabase::setHostName), имя пользователя (QSqlDatabase::setUserName), пароль (QSqlDatabase::setPassword). Подключение к базе данных осуществляется вызовом метода QSqlDatabase::open.

После подключения, с базой возможно взаимодействовать посредством запросов. Передача запроса базе осуществляется методом exec класса QSqlQuery, экземпляр которого должен быть связан с нашей базой (если база одна, связывание произойдёт автоматически). Результатом запроса может быть набор строк, для навигации по которому используются такие методы класса QSqlQuery, как QSqlQuery::first, QSqlQuery::next.

Для получения информации о строке-результате запроса можно использовать экземпляр класса QSqlRecord, который инициализируется посредством вызова QSqlQuery::record. QSqlRecord позволяет получить индекс столбца по имени этого столбца, и чаще всего используется совместно с вызовом QSqlQuery::value для получения значения, хранимого столбцом строки-результата запроса.

Работа с базами данных sqlite в редакторе VS Code #Shorts

Описанными выше средствами мы можем создать базу данных, передать ей запросы на создание таблиц, добавление и выборку данных, в принципе, этого достаточно для нормальной работы с БД. Результаты выборок удобно выводить в таблицу, мы можем сделать это руками, написав цикл с QSqlQuery::next(), однако в Qt есть более удобные, встроенные средства.

Для вывода данных таблицы на экран можно использовать класс QSqlTableModel, экземпляр которого необходимо связать с нашей таблицей базы данных методом QSqlTableModel::setTable. Вызов метода QSqlTableModel::select обновляет данные в модели (используется в случае, если данные в базе были изменены). За отображение таблиц в Qt отвечает класс QTableView, объект которого необходимо связать с моделью при помощи метода QTableView::setModel. Разместить объект QTableView на форме можно при помощи мыши, используя Qt Designer.

QTableView в связке с QSqlTableModel позволяет не только отображать данные базы данных, но и изменять их. Класс QSqlTableModel поддерживает несколько стратегий изменения, которые можно установить вызовом метода QSqlTableModel::setEditStrategy(). Работа с QSqlTableModel будет показана на примере в третьей части статьи.

QTableView может отображать не только таблицы базы данных, но и результаты отдельных выборок (выполнения запросов SELECT), для этого применяется класс QSqlQueryModel. Запрос SELECT передаётся в метод QSqlQueryModel::setQuery, а затем, модель отображается на QTableView вызовом QTableView::setModel.

Читайте также:
Программа 1с бухгалтерия имеет

2 Шаблон проектирования Facade («Фасад»)

Программа, чуть сложнее «hello world«, чаще всего, может быть разделена на подсистемы с фиксированным интерфейсом, т.е. набором функций, предоставляемым подсистемой. Паттерн Facade, как раз, и выступает в роли такого интерфейса, инкапсулируя данные подсистемы и задавая отношения между ее элементами.

Объект Фасад предоставляет упрощённый высокоуровневый интерфейс подсистемы, за счёт использования которого сокращаются зависимости между подсистемами.

Прочитав первую часть статьи, можно заметить, что для работы с базами данных в Qt используется множество объектов. Не очень хочется видеть все эти объекты в основной части программы, их нужно скрыть, для этого можно использовать Фасад. При этом, в программе появится экземпляр класса Facade, который будет предоставлять интерфейс для работы с подсистемой, мы не сможем больше обращаться к элементам подсистемы напрямую, поэтому интерфейс должен быть хорошо продуман. Схематично суть паттерна Facade показана на рис. 1.

рис. 1 использование паттерна Facade

Фасад — очень удобный и простой шаблон проектирования, который постоянно используется всеми без исключения программистами. Facade позволяет:

  • минимизировать зависимости между подсистемами;
  • минимизировать количество объектов, с которыми приходится взаимодействовать клиентам (упрощает работу с системой);
  • предоставить простой интерфейс к сложной системе, которого будет достаточно большинству других систем. Если кому-то не достаточно возможностей такого интерфейса — всегда можно напрямую использовать то, что спрятано за фасад (т.е. фасад ничего не сломал, однако лезть за него не желательно).

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

3 Пример использования баз данных на C++

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

Интерфейс описываемого приложения показан на рис. 2, он содержит:

рис. 2 интерфейс приложения с БД

  • 2 экземпляра QTableView (carView,seatView);
  • 4 экземпляра QLineedit (carID, carNSeats, carNSeats, carNSeats);
  • 4 экземпляра QPushButton (carRem,carAdd,seatAdd,seatRem).

В основной части программы есть лишь 2 объекта — первый для отображения графического интерфейса, созданного в Qt Designer, второй — экземпляр класса Фасада. Исходный код заголовочного файла главного окна приведен в листинг 1.

#ifndef MAINUI_H # define MAINUI_H #include namespace Ui < class MainUI; >class DBFacade; class MainUI : public QDialog < Q_OBJECT public: explicit MainUI(QWidget *parent = 0); ~MainUI(); public slots: void on_carAdd(); void on_carRem(); void on_seatAdd(); void on_seatRem(); private: Ui::MainUI *m_ui; DBFacade* m_db; >; #endif // MAINUI_H

Очевидно, класс DBFacade должен позволять добавлять и удалять информацию из базы. При обновлении информации, должно изменяться отображаемое содержимое таблиц, поэтому экземпляры QTableView должны быть связаны с моделями, инкапсулированными Фасадом.

На листинг 2 приведена реализация методов класса MainUI, как видно, мы не работаем напрямую с базой данных. Большая часть кода выполняет простейшую проверку корректности входных данных (наличие данных в полях ввода).

#include «mainui.h» #include «ui_mainui.h» #include «dbfacade.h» MainUI::MainUI(QWidget *parent) : QDialog(parent), m_ui(new Ui::MainUI) < m_ui->setupUi(this); m_db = new DBFacade(m_ui->carView, m_ui->seatView, this); connect(m_ui->carAdd, SIGNAL(clicked()), SLOT(on_carAdd())); connect(m_ui->carRem, SIGNAL(clicked()), SLOT(on_carRem())); connect(m_ui->seatAdd, SIGNAL(clicked()), SLOT(on_seatAdd())); connect(m_ui->seatRem, SIGNAL(clicked()), SLOT(on_seatRem())); > void MainUI::on_seatRem() < if (m_ui->seatCarID->text().isEmpty() || m_ui->seatNum->text().isEmpty()) return; m_db->remSeat(m_ui->seatCarID->text(), m_ui->seatNum->text()); > void MainUI::on_seatAdd() < if (m_ui->seatCarID->text().isEmpty() || m_ui->seatNum->text().isEmpty()) return; m_db->addSeat(m_ui->seatNum->text(), m_ui->seatCarID->text()); > void MainUI::on_carRem() < if (m_ui->carID->text().isEmpty()) return; m_db->remCar(m_ui->carID->text()); > void MainUI::on_carAdd() < if (m_ui->carID->text().isEmpty() || m_ui->carNSeats->text().isEmpty()) return; m_db->addCar(m_ui->carID->text(), m_ui->carNSeats->text()); > MainUI::~MainUI()

Видно, что конструктору класса DBFacade передаются указатели на QTableView, это делается для того, чтобы связать их с моделями таблиц БД, хранимыми за Фасадом.

Заголовочный файл класса Фасада приведен на листинг 3.

#ifndef DBFACADE_H # define DBFACADE_H # include # include class QTableView; class QSqlTableModel; class DBFacade : public QObject < Q_OBJECT public: DBFacade(QTableView* cars, QTableView* seats, QObject *parent = 0); virtual ~DBFacade(); void addCar(QString snum, QString nSeats); //!< добавляет вагон void remCar(QString snum); //!< удаляет вагон void addSeat(QString num, QString snCar); //!< добавляет место void remSeat(QString snCar, QString num); //!< удаляет место protected: void exec(QString); //!

< пытается выполнить запрос QString qs(QString); //!< выделяет строку одинарными кавычками QSqlDatabase m_db; //!< база данных QSqlQuery *m_query; //!< запрос к базе QSqlRecord m_rec; //!< строка таблицы (ответ на запрос) QSqlTableModel *m_carsModel; //!< модель таблицы автомобилей QSqlTableModel *m_seatsModel; //!< модель таблицы посадочных мест >; #endif // DBFACADE_H

Читайте также:
Как проверить компьютер на майнинговые программы

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

Исходный код реализации методов класса DBFacade приведен на листинг 4 без пояснений, если есть вопросы — задавайте в комментариях.

#include «dbfacade.h» #include /////////////////////////////////SEAT void DBFacade::addSeat(QString num, QString carID) < exec(tr(«SELECT * FROM cars WHERE + carID); m_query->first(); if (m_query->value(m_rec.indexOf(«nseat»)).toString().toInt() < num.toInt()) return; try < exec(tr(«INSERT INTO seats (carID, nseat) VALUES(«) + carID + «,» + num + «)»); >catch(. ) < return; >m_seatsModel->select(); > void DBFacade::remSeat(QString carID, QString num) < exec(tr(«DELETE FROM seats WHERE carID = «) + carID + » AND nseat = » + num); m_seatsModel->select(); > /////////////////////////////////CAR void DBFacade::addCar(QString id, QString nSeats) < try < exec(tr(«INSERT INTO cars (id, nseat) VALUES («) + id + ‘,’ + nSeats + «)»); m_carsModel->select(); > catch(. ) < return; >> void DBFacade::remCar(QString id) < exec(tr(«DELETE FROM seats WHERE carID = «) + id); exec(tr(«DELETE FROM cars WHERE + id); m_carsModel->select(); m_seatsModel->select(); > //////////////////////////////////////////// DBFacade::DBFacade(QTableView* cars, QTableView* seats, QObject *parent) : QObject(parent) < m_db = QSqlDatabase::addDatabase(«QSQLITE»); m_db.setDatabaseName(«projectsDB»); if (false == m_db.open()) throw «can’t open/create DB»; m_query = new QSqlQuery(m_db); if (false == m_db.tables().contains(«seats»)) exec(«CREATE TABLE seats (» // таблица посадочных мест «carID INTEGER, » // серийный номер вагона «nseat INTEGER, » // номер посадочного места «PRIMARY KEY (carID, nseat)» «);» ); if (false == m_db.tables().contains(«cars»)) exec(«CREATE TABLE cars (» // таблица вагонов «id INTEGER PRIMARY KEY, » // серийный номер вагона «nseat INTEGER» // количество посадочных мест «);» ); m_carsModel = new QSqlTableModel(this, m_db); m_carsModel->setTable(«cars»); m_carsModel->select(); m_carsModel->setEditStrategy(QSqlTableModel::OnFieldChange); cars->setModel(m_carsModel); m_seatsModel = new QSqlTableModel(this, m_db); m_seatsModel->setTable(«seats»); m_seatsModel->select(); m_seatsModel->setEditStrategy(QSqlTableModel::OnFieldChange); seats->setModel(m_seatsModel); > DBFacade::~DBFacade() < delete m_query; >QString DBFacade::qs(QString str) < return «‘» + str + «‘»; >void DBFacade::exec(QString str) < m_query->clear(); if (false == m_query->exec(str)) throw tr(«DBFacade Error: can’t exec : «) + str; m_rec = m_query->record(); >

Исходный код примера как всегда можно скачать: Работа с БД[Qt] (исходный код).

Источники, ссылки

  1. Книги раздела «проектирование» (в предложенных книгах более подробно описано про Facade и другие шаблоны проектирования);
  2. Интерактивный учебник SQL. Режим доступа: http://www.sql-tutorial.ru/en/content.html. Очень интересный ресурс. Содержит много примеров и заданий. Интерактивность заключается в вовзможности выполнения запросов с помощью специального сервиса;

Источник: pro-prof.com

Программное создание базы данных SQL Server с помощью ADO.NET и Visual C++ .NET

В этой статье показано, как программно создать базу данных SQL Server с помощью ADO.NET и Visual C++ .NET.

Исходная версия продукта: Visual C++
Исходный номер базы знаний: 307402

Представить

  • Сведения о версии Microsoft Visual Basic .NET см. в статье Создание базы данных SQL Server программными средствами с помощью ADO.NET и Visual Basic .NET.
  • Сведения о версии .NET для Microsoft Visual C# см. в статье Создание базы данных SQL Server программным способом с помощью ADO.NET и Visual C# .NET.

В этой статье рассматриваются следующие пространства имен библиотеки классов Microsoft платформа .NET Framework:

  • System
  • System.Data
  • System.Data.SqlClient

Аннотация

Программистам часто приходится создавать базы данных программным способом. В этой статье описывается использование ADO.NET и Visual C++ .NET для программного создания базы данных Microsoft SQL Server.

Действия по созданию примера

  1. Запустите Microsoft Visual Studio .NET и создайте новый проект управляемого приложения C++. Form1 по умолчанию добавляется в проект.
  2. Добавьте следующий код перед определением Main функции:

#using using namespace System; #using using namespace System; #using using namespace System::Data; using namespace System::Data::SqlClient; #using using namespace System::Windows::Forms;
int main(void) < Console::WriteLine(S»Press ‘C’ and then ENTER to create a new database»); Console::WriteLine(S»Press any other key and then ENTER to quit»); char c = Console::Read(); if (c == ‘C’ || c == ‘c’) < Console::WriteLine(S»Creating the database. «); String* str; SqlConnection* myConn = new SqlConnection («Server=localhost;Integrated security=SSPI;database=master»); str = «CREATE DATABASE MyDatabase ON PRIMARY » «(NAME = MyDatabase_Data, » «FILENAME = ‘C:\MyDatabaseData.mdf’, » «SIZE = 2MB, MAXSIZE = 10MB, FILEGROWTH = 10%)» «LOG ON (NAME = MyDatabase_Log, » «FILENAME = ‘C:\MyDatabaseLog.ldf’, » «SIZE = 1MB, » «MAXSIZE = 5MB, » «FILEGROWTH = 10%)»; try < SqlCommand* myCommand = new SqlCommand(str, myConn); myConn->Open(); myCommand->ExecuteNonQuery(); MessageBox::Show(«Database is created successfully», «MyProgram», MessageBoxButtons::OK, MessageBoxIcon::Information); > catch (System::Exception* ex) < MessageBox::Show(ex->ToString(), «MyProgram», MessageBoxButtons::OK, MessageBoxIcon::Information); > if (myConn->State == ConnectionState::Open) < myConn->Close(); > > return 0; >

Читайте также:
Где в 1с посмотреть релиз программы

Дополнительные примечания

  • Этот код создает пользовательскую базу данных с определенными свойствами.
  • Папка, в которую будут вмещаться созданные MDF- и LDF-файлы, должна уже существовать перед выполнением кода, иначе будет создано исключение.
  • Если вы хотите создать базу данных, аналогичную базе данных модели SQL Server и расположению по умолчанию, измените переменную str в коде:

str = «CREATE DATABASE MyDatabase»

Ссылки

Дополнительные сведения об объектах и синтаксисе ADO.NET см. в статье Доступ к данным с помощью ADO.NET.

Источник: learn.microsoft.com

Взаимодействие с базой данных

Как правило, для хранения больших наборов данных используются различные базы данных. В WPF, как и в целом в .NET, мы можем работать с различными системами управления баз данных — MS SQL Server, Oracle, MySQL, MongoDB, Postgres и т.д. В данном случае рассмотрим взаимодействие приложения на WPF и базы данных MS SQL Server. Хотя общие принципы работы с другими БД не будут теми же.

Прежде всего для работы с базами данных должен быть установлен и запущен MS SQL Server. Все необходимые файлы для загрузки можно найти на офсайте по ссылке MS SQL Server 2014 Express

Итак, создадим новый проект. Пусть он будет называться DbApp . Вначале создадим базу данных, к которой мы будем подключаться. Для этого откроем специальную программу SQL Server 2014 Management Studio , которая устанавливается вместе с MS SQL Server и которая служит для управления базами данных. В левом древовидном меню найдем пункт Databases , нажмем на него правой кнопкой мыши и в появившемся контекстном меню выберем пункт New Database. :

Создание базы данных в WPF

Назовем базу данных mobiledb и нажмем на кнопку OK:

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

Создание таблицы в WPF

Затем нам открывается дизайнер таблицы:

Дизайнер таблицы в SQL Management Studio

В нем надо указать четыре столбца: Id, Title, Company и Price, которые будут представлять соответственно уникальный идентификатор телефона, название его модели, производителя и цену. У первого и четвертого столбца надо указать тип int (то есть целочисленный), а у столбцов Title и Company — тип nvarchar (строковый).

Кроме того, в окне свойств таблицы в поле Name надо ввести имя таблицы — Phones, а в поле Identity Column ввести Id, так как столбец Id будет идентификатором.

И в конце нам надо установить курсор на столбец Id и в панели инструментов программы нажать на золотой ключик. После этого напротив поля Id также должен появиться золотой ключик. Этот ключик будет указывать, что столбец Id будет выполнять роль первичного ключа.

После этого нажмем на сохранение и затем на клавишу F5 (обновление), и в узле нашей базы данных появится новая таблица, которая будет называться dbo.Phones:

Итак, мы создали базу данных и таблицу, и сделаем последний шаг — добавим в базу данных харнимую процедуру, которая осуществляет добавление нового объекта в базу данных. Для этого выберем в узле базы данных пункт Programmability->Stored Procedures . Нажмем на этот узел правой кнопкой мыши и в контекстном меню выберем пункт Stored Procedure. :

Хранимая процедура и WPF

В центральной части программы открывается код процедуры, который генерируется по умолчанию. Заменим этот код следующим::

Эта процедура выполняет добавление данных. После выражения CREATE PROCEDURE идет название процедуры. Процедура называется «sp_InsertPhone», и по этому названию мы ее будем вызывать в коде C#. Название процедуры может быть любое.

Вообще мы бы могли обойтись и без хранимой процедуры. Однако при подключении из кода C# она нам упростит работу, и в дальнейшем мы посмотрим, в чем ее преимущества. И затем нажмем на кнопку Execute. После этого в базу данных добавляется хранимая процедура.

Теперь подключимся к ней из приложения на WPF.

Источник: metanit.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru