Извлекайте и сохраняйте данные из sqlite в массив c / c ++ - PullRequest
0 голосов
/ 12 января 2020

В моей базе данных sqlite есть столбец целых чисел (содержащий номера портов). Теперь я хочу получить список портов из sqlite в виде массива в функции и отправить данные на эти номера портов. Я пытался создать структуру с указателем на Vector, но это не сработало. Создание указателей на символы вызвало ошибку сегментации. Вот мой код:

struct ConnIDs{
    vector<int*> *ids;
};
static int callback(void *NotUsed, int argc, char **argv, char **szColName)
{
    ConnIDs *first=(ConnIDs *)NotUsed;

    for(int i = 0; i < argc; i++)
    {
        if (strcmp(szColName[i], "ConnID") == 0)
        {
            first->ids->push_back(argv[i]);
        }
        std::cout << szColName[i] << " = " << argv[i] << std::endl;
    }
    std::cout << "\n";
    return 0;
}

int main(){
    int result;
    sqlite3 *db;
    ConnIDs first;

    int count = 0; 
    char *szErrMsg = 0;
    int rc = sqlite3_open("Sqlite_Test.db", &db);
    if(rc)
    {
        std::cout << "Can't open database\n";
    } else
    {
        std::cout << "Open database successfully\n";
    }
    char *pSQL2[1];  
    pSQL2[0] = "Select * from Subscribers";
    rc = sqlite3_exec(db, pSQL2[0], callback, &first, &szErrMsg);
    if(rc != SQLITE_OK)
    {
        std::cout << "SQL Error: " << szErrMsg << std::endl;
        sqlite3_free(szErrMsg);
        break;
    }
    else
    {
        printf("count: %s\n", first.ids);
    }
}

1 Ответ

0 голосов
/ 13 января 2020

Это совсем не ошибка в отношении sqlite, это просто неинициализированный указатель. Давайте посмотрим на соответствующий код:

struct ConnIDs{
    vector<int*> *ids;
};
...

ConnIDs first;
rc = sqlite3_exec(db, pSQL2[0], callback, &first, &szErrMsg);
...
static int callback(void *NotUsed, int argc, char **argv, char **szColName)
{
    ConnIDs *first=(ConnIDs *)NotUsed;
    for(int i = 0; i < argc; i++)
       if (strcmp(szColName[i], "ConnID") == 0)
           first->ids->push_back(argv[i]);
}

Я опустил ненужные части. first - это объект ConnIDs, который является std::vector<int*>* - это указатель на вектор. Вы передаете first в ваш callback, а затем сразу же пытаетесь сделать pu sh в ids; однако, вы не инициализировали ids, поэтому он просто указывает на rubbi sh.

Самое простое решение - просто не делать его std::vector<int*>*, а вместо этого просто делать std::vector<int*>, хотя Я не уверен, int* является правильным типом здесь, это будет действительно зависеть от данных в вашей базе данных. Я полагаю, что int или std::string могут быть более применимыми, но я оставлю это вам:

С вышеуказанным изменением ваш код будет работать как есть, но вам нужно будет изменить first->ids->push_back на first->ids.push_back


Дополнительные примечания:

char *pSQL2[1];  
pSQL2[0] = "Select * from Subscribers";
rc = sqlite3_exec(db, pSQL2[0], callback, &first, &szErrMsg);

Это довольно странно. Я бы, наверное, просто написал rc = sqlite3_exec(db, "Select * from Subscribers", ...) или

auto query = "Select * from Subscribers";
rc = sqlite3_exec(db, query.c_str(), callback, &first, &szErrMsg);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...