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

→ Ссылка