2009-09-09 9 views
6

Sto usando SQLite (3.6.4) da un'applicazione C++ (utilizzando la API C standard). La mia domanda è: una volta che una query è stata preparata, utilizzando sqlite3_prepare_v2() e associata ai parametri usando sqlite3_bind_xyz() - esiste un modo per ottenere una stringa contenente la query SQL originale?Ottieni la query SQL originale dall'istruzione preparata in SQLite

Il motivo è quando qualcosa va storto, mi piacerebbe stampare la query (per il debugging - questa è una app di test solo per sviluppatori interni).

Esempio:

sqlite3_prepare_v2(db, "SELECT * FROM xyz WHERE something = ? AND somethingelse = ?", -1, &myQuery, NULL); 
sqlite3_bind_text(myQuery, 1, mySomething); 
sqlite3_bind_text(myQuery, 2, mySomethingElse); 
// .... 

// somewhere else, in another function perhaps 
if (sqlite3_step(myQuery) != SQLITE_OK) 
{ 
    // Here i'd like to print the actual query that failed - but I 
    // only have the myQuery variable 
    exit(-1); 
} 

punti di bonus se si potrebbe anche stampare i parametri attuali, che era legato. :)

risposta

3

Come da commenti in sqlite3.c (fusione), sqlite3_sql(myQuery) restituirà il testo SQL originale.

Non vedo alcuna funzione per trovare il valore associato a un indice particolare, ma possiamo facilmente aggiungerne uno al set standard di funzioni SQLite. Può sembrare qualcosa di simile:

const char* sqlite3_bound_value(sqlite3_stmt* pStmt, int index) 
{ 
    Vdbe *p = (Vdbe *)pStmt; 

    // check if &p->aVar[index - 1] points to a valid location. 
    return (char*)sqlite3ValueText(&p->aVar[index - 1], SQLITE_UTF8); 
} 

Ebbene, il codice di cui sopra mostra che una possibile sqlite3_bound_value vie() potrebbero essere attuate. Non l'ho provato, potrebbe essere sbagliato, ma fornisce alcuni suggerimenti su come/dove iniziare.

+0

grazie per la risposta, ci provo io –

+0

questo è stato il più lontano possibile senza fare troppe modifiche. Sto accettando perché non sembra essere un modo corretto per fare ciò che volevo originariamente. –

1

Citando la documentazione:

nelle interfacce "V2", la dichiarazione preparata che viene restituito (l'oggetto sqlite_stmt) contiene una copia del testo SQL originale.

http://www.sqlite.org/c3ref/prepare.html

4

probabilmente si desidera utilizzare sqlite3_trace

Ciò richiederà una funzione di callback (che si definisce) e dei parametri è un char * di SQL delle istruzioni preparate (inclusi i parametri legati).

Problemi correlati