sqlite3_exec ()! = SQLITE3_OK. Попытка перевести в ООП не будет работать

Я пытаюсь работать с базой данных на C++. Я сделал программу, которая открывает базу данных, а затем создает таблицы в процедурном программировании.
При попытке сделать это в OOP, sqlite3_exec() != SQLITE_OK

Я новичок в этом, так что будьте нежны.

Вот главная.СРР:

#include <iostream>
#include "sqlite3.h"
#include "Table.h"
using namespace std;

int openDatabase(sqlite3 *db);

int main() {
    sqlite3 *db;
    string columnValues, rowValues;   // these are for query
    Table Personal;
    Personal.SettableName("PERSONAL");
    columnValues = "NUME TEXT, ID TEXT";   // this is just an example

    openDatabase(db);

    Personal.createTable(db, columnValues);
    sqlite3_close(db);
    return 0;
}

Таблица.СРР

#include <string>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#include "Table.h"
#include "sqlite3.h"

using namespace std;

static int callback(void *data, int argc, char **argv, char **azColName) {
    int i;
    fprintf(stderr, "%s: ", (const char*)data);

    for(i = 0; i < argc; i++) {
        printf("%s = %sn", azColName[i], argv[i] ? argv[i] : "NULL");
    }

    printf("n");
    return 0;
}

void executeSqlStatement(sqlite3 *db,const char* sql) {
    int rc = 0 ;
    char *zErrMsg = 0;

    rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);  // Here it doesn't work, rc=21;
    if( rc != SQLITE_OK ) {
        fprintf(stderr, "SQL error: %sn", zErrMsg);
        sqlite3_free(zErrMsg);
    } 
    else {
        fprintf(stdout, "Operation done successfullyn");
    }
}

void Table::createTable(sqlite3 *db, string columnDetails) {
    this->sqlCommand =  "CREATE TABLE ";

    this->sqlCommand += (this->tableName + " (" + columnDetails + ");");
    executeSqlStatement(db, this->sqlCommand.c_str());
    printf(sqlCommand.c_str());
}

И Стол.ч

#include "sqlite3.h"
using namespace std;
void executeSqlStatement(sqlite3 *db);
static int callback(void *data, int argc, char **argv, char **azColName);
class Table
{
public:
    void SettableName(string val){tableName = val;}
    void createTable(sqlite3 *db, string columnDetails);    
    string tableName;
    string sqlCommand;
};

1 ответ

  1. Включение sqlite3.hфайла во все три файла не обязательно, так как Table.hбыл включен в оба файла cpp, поэтому вам нужно только иметь его в этом файле.

    Sqlite3.H файл также является системным файлом, поэтому использование include <sqlite3.h>вместо include "sqlite3.h"того, чтобы делает его более ясным, откуда файл исходит.

    Я бы рекомендовал компиляцию с флагами -Walland-Wextra-сначала они, кажется, делают множество жалоб, но стоит обратить внимание на сообщенные проблемы и разработать, как их исправить.

    Таблица.ч

    #include <sqlite3.h>
    using namespace std;
    void executeSqlStatement(sqlite3 *db);
    int callback(void *data, int argc, char **argv, char **azColName);
    class Table
    {
    public:
        void SettableName(string val){tableName = val;}
        void createTable(sqlite3 *db, string columnDetails);    
        string tableName;
        string sqlCommand;
    };
    

    Таблица.СРР

    #include <string>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #include "Table.h"
    
    using namespace std;
    
     int callback(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\n", azColName[i], argv[i] ? argv[i] : "NULL");
        }
    
        printf("\n");
        return 0;
    }
    
    void executeSqlStatement(sqlite3 *db,const char* sql) {
        int rc = 0 ;
        char *zErrMsg = 0;
    
        rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);  // Here it doesn't work, rc=21;
        if( rc != SQLITE_OK ) {
            fprintf(stderr, "SQL error: %s\n", zErrMsg);
            sqlite3_free(zErrMsg);
        } 
        else {
            fprintf(stdout, "Operation done successfully\n");
        }
    }
    
    void Table::createTable(sqlite3 *db, string columnDetails) {
        this->sqlCommand =  "CREATE TABLE ";
    
        this->sqlCommand += (this->tableName + " (" + columnDetails + ");");
        executeSqlStatement(db, this->sqlCommand.c_str());
        printf(sqlCommand.c_str());
    }
    

    главный.СРР

    #include <iostream>
    #include "Table.h"
    using namespace std;
    
    int main() {
        sqlite3 *db;
        sqlite3_open_v2("test.db", &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
        string columnValues, rowValues;   // these are for query
        Table Personal;
        Personal.SettableName("PERSONAL");
        columnValues = "NUME TEXT, ID TEXT";   // this is just an example
    
    
        Personal.createTable(db, columnValues);
        sqlite3_close(db);
        return 0;
    }
    

    На моем github у меня есть рабочая версия вашего кода, с (заимствованным) makefile, чтобы собрать файлы вместе, поэтому мне просто нужно ввестиmake debug, чтобы скомпилировать код.

    make debug && bin/debug/hello
    

    построит файл, и если компиляция прошла успешно запустите исполняемый файл.