Быстрый старт для С++
В этом разделе описывается разработка приложений на языке С++, взаимодействующих с СУБД Компонента.
Создайте тестовую базу данных, с которой будет работать приложение. Чтобы создать тестовую базу данных
testdb
, запустите интерфейс командной строки Компонента (psql
) и выполните команду:CREATE DATABASE testdb;
Для выполнения определенных команд вам могут потребоваться права на подключение к БД и набор прав для работы с данными (DDL, DML). Убедитесь, что у вашей учетной записи есть необходимые права доступа, или войдите в систему под учетной записью, которой такие права предоставлены (например,
postgres
).Убедитесь, что новая база данных создана. Для этого в командной строке выполните команду
\l
. Вы увидите примерно следующее:Раскрыть type=bashpostgres-# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+---------+-------+----------------------- postgres | postgres | UTF8 | C | C | template0 | postgres | UTF8 | C | C | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | C | C | =c/postgres + | | | | | postgres=CTc/postgres testdb | postgres | UTF8 | C | C | (4 rows) postgres-#
Приведенный ниже код реализует подключение к базе данных на локальной машине через порт 5433 от имени пользователя
postgres
.Раскрыть type=c++#include <iostream> #include <pqxx/pqxx> using namespace std; using namespace pqxx; int main(int argc, char* argv[]) { try { connection C("dbname = testdb user = postgres password = <пароль> \ hostaddr = 127.0.0.1 port = 5433"); if (C.is_open()) { cout << "Подключение к базе данных " << C.dbname() << " установлено." << endl; } else { cout << "Не удается установить подключение к базе данных." << endl; return 1; } C.disconnect (); } catch (const std::exception &e) { cerr << e.what() << std::endl; return 1; } }
Скомпилируйте программу и выполните ее:
Раскрыть type=bash$ gсс test.cpp -lpqxx -lpq $ ./a.out Подключение к базе данных testdb установлено.
Приведенный ниже код создает таблицу
MYSTORE
в базе данных testdb
.Раскрыть type=c++#include <iostream> #include <pqxx/pqxx> using namespace std; using namespace pqxx; int main(int argc, char* argv[]) { char * sql; try { connection C("dbname = testdb user = postgres password = <пароль> \ hostaddr = 127.0.0.1 port = 5433"); if (C.is_open()) { cout << "Подключение к базе данных " << C.dbname() << " установлено." << endl; } else { cout << "Не удается установить подключение к базе данных." << endl; return 1; } /* Создать инструкцию SQL */ sql = "CREATE TABLE MYSTORE(" \ "ID INT PRIMARY KEY NOT NULL," \ "ТИП TEXT NOT NULL," \ "ЦВЕТ TEXT NOT NULL," \ "МАТЕРИАЛ TEXT NOT NULL," \ "ЗАПАС INT," \ "ЦЕНА REAL );"; /* Создать транзакционный объект */ work W(C); /* Выполнить SQL-запрос */ W.exec( sql ); W.commit(); cout << "Таблица создана успешно" << endl; C.disconnect (); } catch (const std::exception &e) { cerr << e.what() << std::endl; return 1; } return 0; }
Скомпилируйте программу и выполните ее:
Раскрыть type=bash$ gсс test.cpp -lpqxx -lpq $ ./a.out Подключение к базе данных testdb установлено. Таблица создана успешно
Приведенный ниже код создает записи в таблице
MYSTORE
:Раскрыть type=c++#include <iostream> #include <pqxx/pqxx> using namespace std; using namespace pqxx; int main(int argc, char* argv[]) { char * sql; try { connection C("dbname = testdb user = postgres password = <пароль> \ hostaddr = 127.0.0.1 port = 5433"); if (C.is_open()) { cout << "Подключение к базе данных " << C.dbname() << " установлено." << endl; } else { cout << "Не удается установить подключение к базе данных." << endl; return 1; } /* Создать инструкцию SQL */ sql = "INSERT INTO MYSTORE (ID,ТИП,ЦВЕТ,МАТЕРИАЛ,ЗАПАС,ЦЕНА) " \ "VALUES (1, 'Футболка', 'Синий', 'Хлопок', 500, 2000.00 ); " \ "INSERT INTO MYSTORE (ID,ТИП,ЦВЕТ,МАТЕРИАЛ,ЗАПАС,ЦЕНА) " \ "VALUES (2, 'Футболка', 'Желтый', 'Хлопок', 500, 2000.00 ); " \ "INSERT INTO MYSTORE (ID,ТИП,ЦВЕТ,МАТЕРИАЛ,ЗАПАС,ЦЕНА) " \ "VALUES (3, 'Футболка', 'Красный', 'Хлопок', 500, 2000.00 ); " \ "INSERT INTO MYSTORE (ID,ТИП,ЦВЕТ,МАТЕРИАЛ,ЗАПАС,ЦЕНА) " \ "VALUES (4, 'Рубашка', 'Синий', 'Шелк', 400, 2500.00 ); " \ "INSERT INTO MYSTORE (ID,ТИП,ЦВЕТ,МАТЕРИАЛ,ЗАПАС,ЦЕНА) " \ "VALUES (5, 'Рубашка', 'Белый', 'Хлопок', 600, 1400.00 ); " \ "INSERT INTO MYSTORE (ID,ТИП,ЦВЕТ,МАТЕРИАЛ,ЗАПАС,ЦЕНА) " \ "VALUES (6, 'Свитер', 'Синий', 'Шерсть', 100, 4000.00 ); " \ "INSERT INTO MYSTORE (ID,ТИП,ЦВЕТ,МАТЕРИАЛ,ЗАПАС,ЦЕНА) " \ "VALUES (7, 'Футболка', 'Синий', 'Нейлон', 500, 1000.00 ); "; \ /* Создать транзакционный объект */ work W(C); /* Выполнить SQL-запрос */ W.exec( sql ); W.commit(); cout << "Записи созданы успешно." << endl; C.disconnect (); } catch (const std::exception &e) { cerr << e.what() << std::endl; return 1; } return 0; }
Скомпилируйте программу и выполните ее:
Раскрыть type=bash$ gсс test.cpp -lpqxx -lpq $ ./a.out Подключение к базе данных testdb установлено. Записи созданы успешно.
Приведенный ниже код выводит на экран записи из таблицы
MYSTORE
:Раскрыть type=c++#include <iostream> #include <pqxx/pqxx> using namespace std; using namespace pqxx; int main(int argc, char* argv[]) { char * sql; try { connection C("dbname = testdb user = postgres password = <пароль> \ hostaddr = 127.0.0.1 port = 5433"); if (C.is_open()) { cout << "Подключение к базе данных " << C.dbname() << " установлено." << endl; } else { cout << "Не удается установить подключение к базе данных." << endl; return 1; } /* Создать инструкцию SQL */ sql = "SELECT * from MYSTORE"; /* Создать нетранзакционный объект */ nontransaction N(C); /* Выполнить SQL-запрос */ result R( N.exec( sql )); /* Вывести записи */ for (result::const_iterator c = R.begin(); c != R.end(); ++c) { cout << "ID = " << c[0].as<int>() << endl; cout << "Тип = " << c[1].as<string>() << endl; cout << "Цвет = " << c[2].as<string>() << endl; cout << "Материал = " << c[3].as<string>() << endl; cout << "Запас = " << c[4].as<int>() << endl; cout << "Цена = " << c[5].as<float>() << endl; cout << endl; } cout << "Операция выполнена успешно." << endl; C.disconnect (); } catch (const std::exception &e) { cerr << e.what() << std::endl; return 1; } return 0; }
Скомпилируйте программу и выполните ее:
Раскрыть type=bash$ gсс test.cpp -lpqxx -lpq $ ./a.out Подключение к базе данных testdb установлено. ID = 1 Тип = Футболка Цвет = Синий Материал = Хлопок Запас = 500 Цена = 2000 ID = 2 Тип = Футболка Цвет = Желтый Материал = Хлопок Запас = 500 Цена = 2000 ID = 3 Тип = Футболка Цвет = Красный Материал = Хлопок Запас = 500 Цена = 2000 ID = 4 Тип = Рубашка Цвет = Синий Материал = Шелк Запас = 400 Цена = 2500 ID = 5 Тип = Рубашка Цвет = Белый Материал = Хлопок Запас = 600 Цена = 1400 ID = 6 Тип = Свитер Цвет = Синий Материал = Шерсть Запас = 100 Цена = 4000 ID = 7 Тип = Футболка Цвет = Синий Материал = Нейлон Запас = 500 Цена = 1000 Операция выполнена успешно.
Приведенный ниже код изменяет данные в таблице
MYSTORE
с помощью операции UPDATE
и выводит на экран обновленные записи:Раскрыть type=c++#include <iostream> #include <pqxx/pqxx> using namespace std; using namespace pqxx; int main(int argc, char* argv[]) { char * sql; try { connection C("dbname = testdb user = postgres password = <пароль> \ hostaddr = 127.0.0.1 port = 5433"); if (C.is_open()) { cout << "Подключение к базе данных " << C.dbname() << " установлено." << endl; } else { cout << "Не удается установить подключение к базе данных." << endl; return 1; } /* Создать транзакционный объект */ work W(C); /* Создать инструкцию SQL */ sql = "UPDATE MYSTORE set ЦЕНА = 999.99 where МАТЕРИАЛ='Хлопок'"; /* Выполнить SQL-запрос */ W.exec( sql ); W.commit(); cout << "Записи изменены успешно" << endl; /* Создать инструкцию SQL */ sql = "SELECT * from MYSTORE"; /* Создать нетранзакционный объект */ nontransaction N(C); /* Выполнить SQL-запрос */ result R( N.exec( sql )); /* Вывести записи */ for (result::const_iterator c = R.begin(); c != R.end(); ++c) { cout << "ID = " << c[0].as<int>() << endl; cout << "Тип = " << c[1].as<string>() << endl; cout << "Цвет = " << c[2].as<string>() << endl; cout << "Материал = " << c[3].as<string>() << endl; cout << "Запас = " << c[4].as<int>() << endl; cout << "Цена = " << c[5].as<float>() << endl; cout << endl; } cout << "Операция выполнена успешно." << endl; C.disconnect (); } catch (const std::exception &e) { cerr << e.what() << std::endl; return 1; } return 0; }
Скомпилируйте программу и выполните ее:
Раскрыть type=bash$ gсс test.cpp -lpqxx -lpq $ ./a.out Подключение к базе данных testdb установлено. Записи обновлены успешно. ID = 4 Тип = Рубашка Цвет = Синий Материал = Шелк Запас = 400 Цена = 2500 ID = 6 Тип = Свитер Цвет = Синий Материал = Шерсть Запас = 100 Цена = 4000 ID = 7 Тип = Футболка Цвет = Синий Материал = Нейлон Запас = 500 Цена = 1000 ID = 1 Тип = Футболка Цвет = Синий Материал = Хлопок Запас = 500 Цена = 999.99 ID = 2 Тип = Футболка Цвет = Желтый Материал = Хлопок Запас = 500 Цена = 999.99 ID = 3 Тип = Футболка Цвет = Красный Материал = Хлопок Запас = 500 Цена = 999.99 ID = 5 Тип = Рубашка Цвет = Белый Материал = Хлопок Запас = 600 Цена = 999.99 Операция выполнена успешно.
Приведенный ниже код удаляет данные из таблицы
MYSTORE
с помощью операции DELETE
и выводит на экран обновленные записи:Раскрыть type=c++#include <iostream> #include <pqxx/pqxx> using namespace std; using namespace pqxx; int main(int argc, char* argv[]) { char * sql; try { connection C("dbname = testdb user = postgres password = <пароль> \ hostaddr = 127.0.0.1 port = 5433"); if (C.is_open()) { cout << "Подключение к базе данных " << C.dbname() << " установлено." << endl; } else { cout << "Не удается установить подключение к базе данных." << endl; return 1; } /* Создать транзакционный объект */ work W(C); /* Создать инструкцию SQL */ sql = "DELETE from MYSTORE where МАТЕРИАЛ != 'Хлопок'"; /* Выполнить SQL-запрос */ W.exec( sql ); W.commit(); cout << "Записи изменены успешно." << endl; /* Создать инструкцию SQL */ sql = "SELECT * from MYSTORE"; /* Создать нетранзакционный объект */ nontransaction N(C); /* Выполнить SQL-запрос */ result R( N.exec( sql )); /* Вывести записи */ for (result::const_iterator c = R.begin(); c != R.end(); ++c) { cout << "ID = " << c[0].as<int>() << endl; cout << "Тип = " << c[1].as<string>() << endl; cout << "Цвет = " << c[2].as<string>() << endl; cout << "Материал = " << c[3].as<string>() << endl; cout << "Запас = " << c[4].as<int>() << endl; cout << "Цена = " << c[5].as<float>() << endl; cout << endl; } cout << "Операция выполнена успешно." << endl; C.disconnect (); } catch (const std::exception &e) { cerr << e.what() << std::endl; return 1; } return 0; }
Скомпилируйте программу и выполните ее:
Раскрыть type=bash$ ./delete.out Подключение к базе данных testdb установлено. Записи изменены успешно. ID = 1 Тип = Футболка Цвет = Синий Материал = Хлопок Запас = 500 Цена = 999.99 ID = 2 Тип = Футболка Цвет = Желтый Материал = Хлопок Запас = 500 Цена = 999.99 ID = 3 Тип = Футболка Цвет = Красный Материал = Хлопок Запас = 500 Цена = 999.99 ID = 5 Тип = Рубашка Цвет = Белый Материал = Хлопок Запас = 600 Цена = 999.99 Операция выполнена успешно.