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()のいずれかを使用して準備済みステートメントを準備した後、ステートメントを評価するためにこの関数を1回以上呼び出す必要があります。

詳しくは:

SQLiteには、選択したデータベースでコードを実行するために必要なすべてのアクションを実行する仮想マシンがあります。sqlite3_prepare(およびそのファミリ)は、SQLステートメントをこの仮想マシンで実行できるバイトコードにコンパイルします。一方、sqlite3_stepVMでそのバイトコードを実行します。

于 2012-10-19T16:16:45.880 に答える