SQL с использованием C / C ++ и SQLite

Опубликовано: 30 Ноября, 2021

В этой статье мы хотели бы представить статью о SQLITE в сочетании с C ++ или C.
Прежде чем мы продолжим это руководство, нам нужно выполнить процедуру установки SQLITE3, которую можно легко найти здесь . При этом требуется базовое знание SQL .

Покажем следующие операции:

  • Подключение / создание базы данных
  • Создать таблицу
  • Вставлять
  • Удалить
  • Выбирать


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

Подключение к базе данных / создание таблицы

В этом фрагменте мы будем использовать две процедуры, содержащиеся в библиотеке sqlite3.h.

- sqlite3_open (const char * имя файла, sqlite3 ** ppDb)
- sqlite3_close (sqlite3 * ppDb)

Компиляция выполняется добавлением команды -l sqlite3 .

#include <iostream>
#include <sqlite3.h>
int main( int argc, char ** argv)
{
sqlite3* DB;
int exit = 0;
exit = sqlite3_open( "example.db" , &DB);
if ( exit ) {
std::cerr << "Error open DB " << sqlite3_errmsg(DB) << std::endl;
return (-1);
}
else
std::cout << "Opened Database Successfully!" << std::endl;
sqlite3_close(DB);
return (0);
}

Выход:

$ g ++ createDB.cpp -l sqlite3
$ ./a.out

База данных успешно открыта!

$ ls
create.cpp
а. выход
example.db

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

Создать таблицу

В этом фрагменте мы будем использовать процедуру:

- sqlite3_exec (sqlite3 *, const char * sql, sqlite_callback, void * data, char ** errmsg)
#include <iostream>
#include <sqlite3.h>
int main( int argc, char ** argv)
{
sqlite3* DB;
std::string sql = "CREATE TABLE PERSON("
"ID INT PRIMARY KEY NOT NULL, "
"NAME TEXT NOT NULL, "
"SURNAME TEXT NOT NULL, "
"AGE INT NOT NULL, "
"ADDRESS CHAR(50), "
"SALARY REAL );" ;
int exit = 0;
exit = sqlite3_open( "example.db" , &DB);
char * messaggeError;
exit = sqlite3_exec(DB, sql.c_str(), NULL, 0, &messaggeError);
if ( exit != SQLITE_OK) {
std::cerr << "Error Create Table" << std::endl;
sqlite3_free(messaggeError);
}
else
std::cout << "Table created Successfully" << std::endl;
sqlite3_close(DB);
return (0);
}

Выход:

$ g ++ createTable.cpp -l sqlite3
$ ./a.out

Таблица создана успешно

Эта процедура возвращает целое число: если целое число равно макросу SQLITE_OK , все работает хорошо.
В этом примере опущены элементы управления открытием базы данных, которые были написаны в предыдущем коде.

Вставить и удалить

Мы также будем использовать процедуру SQLITE3_EXEC () для Insert. Порядок действий и проверки аналогичны предыдущим. Есть только одно отличие в строке, которую мы используем с SQLITE3_EXEC () .

#include <iostream>
#include <sqlite3.h>
#include <string>
using namespace std;
static callback( int void * data, int argc, char ** argv, char ** azColName)
{
int i;
fprintf (stderr, "%s: " , ( const char *)data);
for (i = 0; i < argc; i++) {
printf ( "%s = %s " , azColName[i], argv[i] ? argv[i] : "NULL" );
}
printf ( " " );
return 0;
}
int main( int argc, char ** argv)
{
sqlite3* DB;
char * messaggeError;
int exit = sqlite3_open( "example.db" , &DB);
string query = "SELECT * FROM PERSON;" ;
cout << "STATE OF TABLE BEFORE INSERT" << endl;
sqlite3_exec(DB, query.c_str(), callback, NULL, NULL);
string sql( "INSERT INTO PERSON VALUES(1, 'STEVE', 'GATES', 30, 'PALO ALTO', 1000.0);"
"INSERT INTO PERSON VALUES(2, 'BILL', 'ALLEN', 20, 'SEATTLE', 300.22);"
"INSERT INTO PERSON VALUES(3, 'PAUL', 'JOBS', 24, 'SEATTLE', 9900.0);" );
exit = sqlite3_exec(DB, sql.c_str(), NULL, 0, &messaggeError);
if ( exit != SQLITE_OK) {
std::cerr << "Error Insert" << std::endl;
sqlite3_free(messaggeError);
}
else
std::cout << "Records created Successfully!" << std::endl;
cout << "STATE OF TABLE AFTER INSERT" << endl;
sqlite3_exec(DB, query.c_str(), callback, NULL, NULL);
sql = "DELETE FROM PERSON WHERE ID = 2;" ;
exit = sqlite3_exec(DB, sql.c_str(), NULL, 0, &messaggeError);
if ( exit != SQLITE_OK) {
std::cerr << "Error DELETE" << std::endl;
sqlite3_free(messaggeError);
}
else
std::cout << "Record deleted Successfully!" << std::endl;
cout << "STATE OF TABLE AFTER DELETE OF ELEMENT" << endl;
sqlite3_exec(DB, query.c_str(), callback, NULL, NULL);
sqlite3_close(DB);
return (0);
}

Выход:

$ g ++ insertDelete.cpp -l sqlite3
$ ./a.out
СОСТОЯНИЕ ТАБЛИЦЫ ПЕРЕД ВСТАВКОЙ
Рекорды созданы успешно!
СОСТОЯНИЕ ТАБЛИЦЫ ПОСЛЕ ВСТАВКИ
ID = 1
ИМЯ = СТИВ
ФАМИЛИЯ = ВОРОТА
ВОЗРАСТ = 30
АДРЕС = ПАЛО АЛЬТО
ЗАРПЛАТА = 1000.0

ID = 2
ИМЯ = БИЛЛ
ФАМИЛИЯ = АЛЛЕН
ВОЗРАСТ = 20
АДРЕС = СИЭТЛ
ЗАРПЛАТА = 300,22

ID = 3
ИМЯ = ПАВЕЛ
ФАМИЛИЯ = РАБОТА
ВОЗРАСТ = 24
АДРЕС = СИЭТЛ
ЗАРПЛАТА = 9900.0

Запись успешно удалена!
СОСТОЯНИЕ ТАБЛИЦЫ ПОСЛЕ УДАЛЕНИЯ ЭЛЕМЕНТА
ID = 1
ИМЯ = СТИВ
ФАМИЛИЯ = ВОРОТА
ВОЗРАСТ = 30
АДРЕС = ПАЛО АЛЬТО
ЗАРПЛАТА = 1000.0

ID = 3
ИМЯ = ПАВЕЛ
ФАМИЛИЯ = РАБОТА
ВОЗРАСТ = 24
АДРЕС = СИЭТЛ
ЗАРПЛАТА = 9900.0



Выбирать

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

typedef int (* sqlite3_callback) (
   void *, / * Данные, указанные в 4-м аргументе sqlite3_exec () * /
   int, / * Количество столбцов в строке * /
   char **, / * Массив строк, представляющих поля в строке * /
   char ** / * Массив строк, представляющих имена столбцов * /
);

Теперь мы будем использовать функцию обратного вызова в Select, как показано в следующем фрагменте:

#include <iostream>
#include <sqlite3.h>
using namespace std;
static callback( int void * data, int argc, char ** argv, char ** azColName)
{
int i;
fprintf (stderr, "%s: " , ( const char *)data);
for (i = 0; i < argc; i++) {
printf ( "%s = %s " , azColName[i], argv[i] ? argv[i] : "NULL" );
}
printf ( " " );
return 0;
}
int main( int argc, char ** argv)
{
sqlite3* DB;
int exit = 0;
exit = sqlite3_open( "example.db" , &DB);
string data( "CALLBACK FUNCTION" );
string sql( "SELECT * FROM PERSON;" );
if ( exit ) {
std::cerr << "Error open DB " << sqlite3_errmsg(DB) << std::endl;
return (-1);
}
else
std::cout << "Opened Database Successfully!" << std::endl;
int rc = sqlite3_exec(DB, sql.c_str(), callback, ( void *)data.c_str(), NULL);
if (rc != SQLITE_OK)
cerr << "Error SELECT" << endl;
else {
cout << "Operation OK!" << endl;
}
sqlite3_close(DB);
return (0);
}

Выход:
$ g ++ select.cpp -l sqlite3
$ ./a.out

База данных успешно открыта!
РЕЗУЛЬТАТ ВЫБОРА
ID = 1
ИМЯ = СТИВ
ФАМИЛИЯ = ВОРОТА
ВОЗРАСТ = 30
АДРЕС = ПАЛО АЛЬТО
ЗАРПЛАТА = 1000.0

ID = 3
ИМЯ = ПАВЕЛ
ФАМИЛИЯ = РАБОТА
ВОЗРАСТ = 24
АДРЕС = СИЭТЛ
ЗАРПЛАТА = 9900.0

Операция ОК!


Эта статья представляет собой краткое руководство по базам данных с SQLITE3 с использованием C ++ / C.
В наших примерах мы использовали C ++, но когда мы передавали наши строки, мы вызывали метод c_str () , чтобы преобразовать строку в символьный массив: это доказывает, что все используемые процедуры могут быть использованы и в C.

Эта статья написана в сотрудничестве с Витторио Триасси, студентом факультета науки и технологий Неаполитанского университета Партенопа .

Хотите узнать о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровня C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .