何时sqlite编译语句被'执行'

时间:2012-10-19 16:02:39

标签: c++ sql sqlite

我正在为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期间?

非常感谢任何清晰度:)

干杯

Jarrett的

1 个答案:

答案 0 :(得分:3)

根据SQLite documentation for 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中执行该字节码。