SQL с использованием C / C ++ и SQLite
В этой статье мы хотели бы представить статью о 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.
Эта статья написана в сотрудничестве с Витторио Триасси, студентом факультета науки и технологий Неаполитанского университета Партенопа .