首页 > 解决方案 > 从 sqlite 检索数据并将其存储到数组 c/c++

问题描述

我的 sqlite 数据库中有一列整数(包含端口号)。现在我想在函数中以数组形式从 sqlite 检索端口列表并将数据发送到这些端口号。我试图制作一个指向 Vector 的结构,但没有成功。制作 char 指针会导致分段错误。这是我的代码:

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);
    }
}

标签: c++sqlite

解决方案


这根本不是关于 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,然后立即尝试推入ids;但是,您还没有初始化ids,所以它只是指向垃圾。

最简单的解决方法是不将其设为 astd::vector<int*>*而是将其设为std::vector<int*>,尽管我不确定int*此处的类型是否正确,但它实际上取决于数据库中的数据。我想要么只是intstd::string可能更适用,但我会把它留给你:

通过上述更改,您的代码将按原样运行,但您需要更改first->ids->push_backfirst->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);

推荐阅读