0

我正在为 SQLite API 编写一个轻量级的包装器。

基本上,我很好奇 SQLite 预编译语句如何/何时执行......

我去的时候:

char buffer[] = "INSERT INTO example VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)";
sqlite3_stmt* stmt;
sqlite3_prepare_v2(mDb, buffer, strlen(buffer), &stmt, NULL);

for (unsigned i = 0; i < mVal; i++)
{
    std::string id = getID();
    sqlite3_bind_text(stmt, 1, id.c_str(), id.size(), SQLITE_STATIC);
    sqlite3_bind_double(stmt, 2, getDouble());
    sqlite3_bind_double(stmt, 3, getDouble());
    sqlite3_bind_double(stmt, 4, getDouble());
    sqlite3_bind_int(stmt, 5, getInt());
    sqlite3_bind_int(stmt, 6, getInt());
    sqlite3_bind_int(stmt, 7, getInt());

    if (sqlite3_step(stmt) != SQLITE_DONE)
    {
        printf("Commit Failed!\n");
    }

    sqlite3_reset(stmt);
}

sqlite3_finalize(stmt);

实际的 sql 是在什么时候执行的?是在通话期间sqlite3_prepare_v2,还是在第一次通话期间sqlite3_step

非常感谢任何清晰度:)

干杯

贾勒特

4

1 回答 1

3

根据SQLite 文档sqlite3_prepare,我们看到:

要执行 SQL 查询,必须首先使用以下例程之一将其编译为字节码程序:sqlite3_prepare、sqlite3_prepare_v2、sqlite3_prepare16、sqlite3_prepare16_v2。

对于sqlite3_step

在使用 sqlite3_prepare_v2() 或 sqlite3_prepare16_v2() 或遗留接口 sqlite3_prepare() 或 sqlite3_prepare16() 之一准备好准备好的语句后,必须调用此函数一次或多次来评估该语句。

更多信息:

SQLite 有一个虚拟机,它执行所有必要的操作来在选定的数据库上执行你的代码。sqlite3_prepare(及其家族)将您的 SQL 语句编译成可以在该虚拟机上执行的字节码。另一方面,sqlite3_step在 VM 中执行该字节码。

于 2012-10-19T16:16:45.880 回答