Avec les requêtes préparées seules non. Il va falloir les coupler avec les transactions. En gros tu va ouvrir ta transaction, décrire ta requête, boucler sur tes données et sur la requête et valider à la fin pour tout insérer d'un coup.
Sur le principe ça va donner un truc comme ça :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 | char* errorMessage;
sqlite3_exec(mDb, "BEGIN TRANSACTION", NULL, NULL, &errorMessage);
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_exec(mDb, "COMMIT TRANSACTION", NULL, NULL, &errorMessage);
sqlite3_finalize(stmt);
|
L'exemple est imparfait, rien ne serait inséré en cas de soucis ou alors il pourrait manquer des bouts. Dans ce genre de grosses opération tu peux faire des commits intermédiaires (tous les 1000 requetes ou plus) en cas de soucis, mais il faut avoir un identifiant dans le contenu pour savoir où reprendre.
Mais ça devrait déjà te donner une direction pour avancer.
Source ici ; paragraphe « Prepared Statements »
Edit : sinon je viens d'y penser : Sqlite sait importer des données au format CSV … ça peut aider aussi !