Ho il seguente pezzo di codice che utilizza Sqlite3 su Ubuntu (C++):C++ sqlite3_exec in grado di chiudere a causa di dichiarazioni non finalizzati
void test_function(dbHandler)
{
char *retError = 0;
std::string sql("INSERT INTO LOG (LAST_CHANGED_DATE_TIME) VALUES ('TEST');");
int returnStatus = sqlite3_exec(dbHandler, sql.c_str(), 0, 0, &retError);
std::cout << "RetStatus = " << returnStatus << "; " << retError << s
if (returnStatus == SQLITE_OK)
return sqlite3_changes(dbHandler);
else
{
sqlite3_free(retError);
sqlite3_close(dbHandler);
}
}
Il sqlite3_exec
dichiarazione sql
è fatto male per testare il suo comportamento failture (in quel caso il nome del campo non corrisponde). Ottengo uno stato corretto da sqlite3_exec
come:
Status = 1; table Log has no column named last_changed_date_time
Come è un errore, ho bisogno di liberare il messaggio di errore (retError
) e chiudere la connessione al database. E qui è dove ho un problema:
Quando si chiama sqlite3_close
, sto ottenendo il seguente messaggio di eccezione:
unable to close due to unfinalized statements or unfinished backups
Ive sfogliati intorno sqlite3 docs e non poteva scoprire che cosa io non sono liberando qui ...
sulla base di che ho bisogno di aiuto per:
a) Fissare il codice di cui sopra.
b) Comprendere il modo corretto per ripristinare da sqlite3_exec in caso di errore.
Grazie per l'aiuto.
Mostra tutte le altre chiamate DB eseguite tra l'apertura del database e questa funzione. –
L'unica cosa che faccio è emettere un 'SELECT COUNT (*) FROM LOG' usando la stessa struttura' sql_exec' ... Sto pensando che questo potrebbe essere il problema ... – Mendes
Le istruzioni non finalizzate sono finalizzate con ['sqlite3_finalize (sqlite3_stmt *)'] (https://www.sqlite.org/capi3ref.html#sqlite3_finalize) e i backup non finiti sono terminati con ['sqlite3_backup_finish()'] (https: // www.sqlite.org/capi3ref.html#sqlite3backupfinish). Ci si può aspettare che finisca in questo stato da una precedente chiamata 'sqlite3_'. Si prega di fornire un [mcve] (http://stackoverflow.com/help/mcve). – YSC