2009-02-24 11 views
9

Sto scrivendo un codice C++ che utilizza la libreria sqlite3. Sto usando un'istruzione preparata a cui associo una variabile in fase di esecuzione.istruzioni preparate in sqlite - come eseguire il debug

Come si esamina la query SQL nella dichiarazione dopo i binding?

Ad esempio, il codice riportato di seguito non restituisce una riga. Quando utilizzo una stringa premade e sqlite3_exec, ottengo i risultati che mi aspetto.

sqlite3_stmt *statement; 
const char *query = "SELECT * FROM foo WHERE (name='?');"; 
sqlite3_prepare_v2(db, query, strlen(query), &statemtnt, NULL); 
sqlite3_bind_text(statement, 1, "bar", -1, SQLITE3_STATIC); 
int result = sqlite3_step(statement); 
// expected: result = SQLITE_ROW 
// actual: result = SQLITE_DONE 

Edit: Come Ferdinand sotto enunciati, il problema nella query di cui sopra è le virgolette intorno al?. Tuttavia, per il futuro, mi piacerebbe ancora sapere come ispezionare sqlite3_stmt per la query effettiva che verrà eseguita.

risposta

1

Il terzo parametro di sqlite3_bind_text dovrebbe essere il valore che si desidera associare: nel codice si sta tentando di associare la query a se stesso!

Inoltre, perde il punto e virgola alla fine di SELECT.

+0

Siamo spiacenti, ha avuto un errore di battitura quando scrivi la domanda. Quindi, no, non è questo il vero problema, mi spiace –

+0

Credo che sia richiesto il punto e virgola –

6

La query SQL non cambia dopo i binding: le variabili non sono inserite nella stringa SQL o altro.

Oltre a ciò che ha detto Neil, lasciare le virgolette attorno al? segnaposto:

"SELECT * FROM foo WHERE name = ?" 

Altrimenti SQLite non sostituirà il punto di domanda, ma tratterà come la stringa "?".

+1

Grazie, il problema erano effettivamente le virgolette intorno al?. –

+0

So che la stringa sql non cambia (l'ho dichiarata const, dopo tutto). MA, l'affermazione cambia. C'è un modo per vedere quale query andrà al DB dopo i binding osservando la dichiarazione? –

+0

Vuoi dire che vuoi ispezionare l'albero di analisi generato da SQLite? Non penso che tu possa farlo senza dover scavare nel codice sorgente SQLite ... –

-1

Non conosco bene sqlite, ma la query effettiva potrebbe essere registrata o si potrebbe essere in grado di capovolgere un interruttore per farlo registrare.

1

Sì, è possibile farlo attraverso la definizione di una funzione di profilo come questo:

static void profile(void *context, const char *sql, sqlite3_uint64 ns) { 
fprintf(stderr, "Query: %s\n", sql); 
fprintf(stderr, "Execution Time: %llu ms\n", ns/1000000);} 

Poi subito dopo si apre il database utilizzando sqlite3_open, fanno di questa chiamata:

sqlite3_profile(fDBLink, &profile, NULL); 
+0

Ho appena provato questo; non mostra il risultato dei vincoli come op sembra desiderare. – kasterma

+0

Buon suggerimento ma non mostra gli argomenti bindati – inversus

Problemi correlati