我正在为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的
答案 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中执行该字节码。