c++ - 从 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);
}
}
解决方案
这根本不是关于 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*
此处的类型是否正确,但它实际上取决于数据库中的数据。我想要么只是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);
推荐阅读
- javascript - 如何在滚动位置上显示一次弹出窗口
- java - 在 Azure AD B2C 注册页面上添加自定义电话号码字段
- python-3.x - OutOfBoundsDatetime:越界纳秒时间戳:219-03-28 09:36:32 将 str 转换为 datetime
- c - 多讲短网址?
- react-native - React Native WebRTC setRemoteDescription 错误
- xml - 如何在 Ansible 中用“复杂”节点替换 XML 节点?
- bootstrap-4 - 如何在flex-wrap之后显示一个div
- c++ - 如何获得哈希表的最大链的长度?
- java - Java 8基于多个条件和日期对对象的Arraylist进行排序
- python - PyTorch 相同输入不同输出(非随机)