SQLite从C++多插入只是添加了第一个
SQLite multi insert from C++ just adding the first one
我有以下SQLite代码:
std::vector<std::vector<std::string> > InternalDatabaseManager::query(std::string query)
{
sqlite3_stmt *statement;
std::vector<std::vector<std::string> > results;
if(sqlite3_prepare_v2(internalDbManager, query.c_str(), -1, &statement, 0) == SQLITE_OK)
{
int cols = sqlite3_column_count(statement);
int result = 0;
while(true)
{
result = sqlite3_step(statement);
std::vector<std::string> values;
if(result == SQLITE_ROW)
{
for(int col = 0; col < cols; col++)
{
std::string s;
char *ptr = (char*)sqlite3_column_text(statement, col);
if(ptr) s = ptr;
values.push_back(s);
}
results.push_back(values);
} else
{
break;
}
}
sqlite3_finalize(statement);
}
std::string error = sqlite3_errmsg(internalDbManager);
if(error != "not an error") std::cout << query << " " << error << std::endl;
return results;
}
当我试图传递一个查询字符串时,比如:
INSERT INTO CpuUsage (NODE_ID, TIME_ID, CORE_ID, USER, NICE, SYSMODE, IDLE, IOWAIT, IRQ, SOFTIRQ, STEAL, GUEST) VALUES (1, 1, -1, 1014711, 117915, 175551, 5908257, 112996, 2613, 4359, 0, 0); INSERT INTO CpuUsage (NODE_ID, TIME_ID, CORE_ID, USER, NICE, SYSMODE, IDLE, IOWAIT, IRQ, SOFTIRQ, STEAL, GUEST) VALUES (1, 1, 0, 1014711, 117915, 175551, 5908257, 112996, 2613, 4359, 0, 0); INSERT INTO CpuUsage (NODE_ID, TIME_ID, CORE_ID, USER, NICE, SYSMODE, IDLE, IOWAIT, IRQ, SOFTIRQ, STEAL, GUEST) VALUES (1, 1, 1, 1014711, 117915, 175551, 5908257, 112996, 2613, 4359, 0, 0);
结果只是插入第一个插入。使用其他一些工具lite SQLiteStudio,它执行得还可以
有什么想法可以帮我吗?
谢谢,
Pedro
编辑
我的查询是std::字符串。
const char** pzTail;
const char* q = query.c_str();
int result = -1;
do {
result = sqlite3_prepare_v2(internalDbManager, q, -1, &statement, pzTail);
q = *pzTail;
}
while(result == SQLITE_OK);
这给了我描述:无法将参数"5"的"const char*"转换为"const char**",将其转换为"int sqlite3_prepare_v2(sqlite3*,const char*int,sqlite3_stmt*,const char*)"
SQLite的prepare_v2只会从字符串中的第一个插入创建一条语句。你可以把它看作是一种"流行前沿"机制。
int sqlite3_prepare_v2(
sqlite3 *db, /* Database handle */
const char *zSql, /* SQL statement, UTF-8 encoded */
int nByte, /* Maximum length of zSql in bytes. */
sqlite3_stmt **ppStmt, /* OUT: Statement handle */
const char **pzTail /* OUT: Pointer to unused portion of zSql */
);
发件人http://www.sqlite.org/c3ref/prepare.html
如果pzTail不为NULL,则使*pzTail指向第一个字节超过zSql中第一条SQL语句的末尾。仅这些例程在zSql中编译第一条语句,因此*pzTail指向尚未编译的内容。
pzTail参数将指向插入的其余部分,因此您可以循环遍历它们,直到它们都准备好为止。
另一种选择是一次只插入一个,这会使处理代码的其余部分变得更简单,通常是。
通常,我看到人们在做这种事情时,以为他们会在同一笔交易中接受评估。但事实并非如此。第二个可能会失败,第一个和第三个仍然会成功。
相关文章:
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 当我们从/tp地址中添加/减去一个整数时会发生什么
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 如何仅读取文本文件中的第一个值
- 在C++中,如何在第一个"system()"结束后执行第二个"system()"?
- 查找不在标准中的第一个值::设置<int>最小-最大值
- 为什么 QXmlQuery 似乎在结果中添加了一个""?(以及如何解决它?
- C++:忽略第一个 cin.ignore 之后的输入
- 在C++中打印多个矢量的第一个值
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- C++第一个cout将不会打印
- 我们可以在第一个else-if条件结束后使用另一个else-if条件吗
- OpenGL:第二个VBO破坏了第一个VBO
- 为什么第一个Dynamic_cast没有投射到基类?
- 尝试向 COM 对象添加另一个接口时出现静态强制转换错误 C2440
- OpenGL 2D游戏只绘制第二个精灵纹理而不是第一个
- C++ 为什么程序只读取第一个值
- 如何添加到 2 路链表的第一个
- 在链表末尾添加并显示链表中的第一个值
- SQLite从C++多插入只是添加了第一个