C++ SQLITE выборка и сохранение в масив
Решил научиться сохранять данные не в просто файл а в файл баз данных. Использовал sqlite3
#include <sqlite3.h>
Но вот не пойму в чём логика статичных функций, с блокировкой записи в глобальною переменную? Пример брал здесь который взят отсюда . Но как извлечь дынные в переменную. Иначе нет смысла в базе данных.
как работает библиотека.
Суть: как записать данные с базы даних в мой масив в программе
std::strig data;
//Через функцию пропустит все записи
static int CallBack1(void *NotUsed, int argc, char **argv, char **azColName)
{
for(int i = 0; i<argc; i++)
{
data+=azColName[i] + " " + argv[i] + "\n"; //Ошибка нельзя функция статична а не статичную не принимает как аргумент
printf("%s %s\t",azColName[i], argv[i] );
}
}
bool TestZapros()
{
rc = sqlite3_open("test.db", &db);
if( rc ) {
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
return(0);
} else {
fprintf(stderr, "Opened database successfully\n");
}
std::stringstream SQL;
SQL<<"SELECT * from INTERVAL WHERE";
SQL<<" M = " << 12;
SQL<<" AND D = " << 1;
SQL<<" AND Y = " << 2021;
/* Execute SQL statement */
rc = sqlite3_exec(db, SQL.str().c_str(), CallBack1, (void*)data, &zErrMsg);
if( rc != SQLITE_OK ) {
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Operation done successfully\n");
}
sqlite3_close(db);
return 1;
}
Ответы (1 шт):
Автор решения: Юрій Писанка
→ Ссылка
Нашёл ответ здесь
Не знаю что за язык, но парень показал адекватно как установить библиотеку и как нормально извлечь данние.
Набросал пример
#include <iostream>
#include <sqlite3.h>
#include <vector>
#include <string>
#include <sstream>
sqlite3 *db;
char *zErrMsg = 0;
int rc;
sqlite3_stmt *stmt;
int main()
{
//Создать/Открыть базу даных
rc = sqlite3_open("tes.db", &db);
if( rc ) {
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
return(0);
} else {
fprintf(stderr, "Opened database successfully\n");
}
{//Создать таблицу с названием INTERVAL
std::stringstream SQL;
SQL<<"CREATE TABLE INTERVAL(ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,";
SQL<<"NAME TEXT NOT NULL,";
SQL<<"AGE INT NOT NULL";
SQL<<");";
rc = sqlite3_exec(db, SQL.str().c_str() , NULL, 0, &zErrMsg);
if( rc != SQLITE_OK ){ fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } else { fprintf(stdout, "Table created successfully\n"); } }
{//Записать данные
std::stringstream SQL;
SQL << "INSERT INTO INTERVAL (NAME,AGE) ";
SQL << "VALUES ('"<<"Jone"<<"','"<<25<< "'); ";
SQL << "INSERT INTO INTERVAL (NAME,AGE) ";
SQL << "VALUES ('"<<"Masha"<<"','"<<15<< "'); ";
SQL << "INSERT INTO INTERVAL (NAME,AGE) ";
SQL << "VALUES ('"<<"Botemm"<<"','"<<27<< "'); ";
SQL << "INSERT INTO INTERVAL (NAME,AGE) ";
SQL << "VALUES ('"<<"Jora"<<"','"<<33<< "'); ";
SQL << "INSERT INTO INTERVAL (NAME,AGE) ";
SQL << "VALUES ('"<<"Kolya"<<"','"<<23<< "'); ";
SQL << "INSERT INTO INTERVAL (NAME,AGE) ";
SQL << "VALUES ('"<<"Anna"<<"','"<<26<< "'); ";
//...
rc = sqlite3_exec(db, SQL.str().c_str() , NULL, 0, &zErrMsg);
if( rc != SQLITE_OK ){fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg);} else {fprintf(stdout, "Records created successfully\n"); }
}
{//Достать данные
std::stringstream SQL;
SQL<<"SELECT * from INTERVAL WHERE AGE >=25 AND AGE <=27";
rc = sqlite3_prepare_v2(db, SQL.str().c_str() ,-1, &stmt, NULL);
if( rc != SQLITE_OK ) { fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg);
} else {
std::cout<<"ID\tNAME\tAGE\n\n";
while( (rc = sqlite3_step(stmt) == SQLITE_ROW) )
{
std::cout<<sqlite3_column_text(stmt,0)<<"\t"<<sqlite3_column_text(stmt,1)<<"\t"<<sqlite3_column_text(stmt,2)<<"\n";
}
fprintf(stdout, "Operation done successfully\n");
}
}
{//Обновить данные
std::stringstream SQL;
//Всем с именем Jone установить 19 лет
SQL << "UPDATE INTERVAL set AGE = '19' where NAME='Jone';";
//...
rc = sqlite3_exec(db, SQL.str().c_str() , NULL, 0, &zErrMsg);
if( rc != SQLITE_OK ){fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg);} else {fprintf(stdout, "Records created successfully\n"); }
}
{//Удалить даные
std::stringstream SQL;
SQL << " DELETE from INTERVAL where NAME='Anna';";
//...
rc = sqlite3_exec(db, SQL.str().c_str() , NULL, 0, &zErrMsg);
if( rc != SQLITE_OK ){fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg);} else {fprintf(stdout, "Records created successfully\n"); }
}
//Закрыть базу данных
sqlite3_close(db);
return 0;
}
Результат можно проверить открыв базу данных например при помощи db browser for sqlite