2009-02-24 18 views
9

Estoy escribiendo un código C++ que usa la biblioteca sqlite3. Estoy usando una declaración preparada a la que ato una variable en tiempo de ejecución.declaraciones preparadas sqlite - cómo depurar

¿Cómo examino la consulta SQL en la declaración después de las consolidaciones?

Por ejemplo, el código siguiente no devuelve una fila. Cuando uso una cadena prefabricada y sqlite3_exec, obtengo los resultados que espero.

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 

editar: Como dijo Ferdinand a continuación, el problema en la consulta anterior es las citas en torno al?. Sin embargo, para el futuro, aún me gustaría saber cómo inspeccionar sqlite3_stmt para la consulta real que se ejecutará.

Respuesta

1

Se supone que el tercer parámetro de sqlite3_bind_text es el valor que desea vincular: en el código, intenta vincular la consulta consigo mismo.

Además, pierda el punto y coma al final de SELECCIONAR.

+0

Lo sentimos, tenía un error tipográfico al escribir la pregunta. Entonces, no, ese no es el problema real, lo siento –

+0

Creo que se requiere el punto y coma –

6

La consulta SQL no cambia después de los enlaces: sus variables no se insertan en la cadena SQL ni nada.

Además de lo que dijo Neil, soltar las comillas alrededor? marcador de posición:

"SELECT * FROM foo WHERE name = ?" 

De lo contrario SQLite no reemplazará el signo de interrogación, pero lo tratará como la cadena "?".

+1

Gracias, el problema fue de hecho las citas en torno al?. –

+0

Sé que la cadena sql no cambia (lo declare const, después de todo). PERO, la declaración cambia. ¿Hay alguna manera de ver qué consulta irá al DB después de los enlaces mirando el enunciado? –

+0

¿Quiere decir que quiere inspeccionar el árbol de análisis sintáctico generado por SQLite? No creo que puedas hacer eso sin profundizar en el código fuente SQLite ... –

-1

No conozco muy bien sqlite, pero es posible que se haya registrado la consulta real o que sea posible activar un interruptor para que se registre.

1

Sí, puede hacerlo mediante la definición de una función de perfil de esta manera:

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);} 

A continuación, justo después de abrir la base de datos utilizando sqlite3_open, hacen de esta llamada:

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

Acabo de probar esto; no muestra el resultado de las consolidaciones como Op parece desear. – kasterma

+0

Buena sugerencia pero no muestra los argumentos combinados – inversus

Cuestiones relacionadas