SQLite从C++多插入只是添加了第一个

SQLite multi insert from C++ just adding the first one

本文关键字:添加 第一个 插入 C++ SQLite      更新时间:2023-10-16

我有以下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参数将指向插入的其余部分,因此您可以循环遍历它们,直到它们都准备好为止。

另一种选择是一次只插入一个,这会使处理代码的其余部分变得更简单,通常是

通常,我看到人们在做这种事情时,以为他们会在同一笔交易中接受评估。但事实并非如此。第二个可能会失败,第一个和第三个仍然会成功。