2009-09-09 15 views
6

Estoy usando SQLite (3.6.4) desde una aplicación C++ (usando la API C estándar). Mi pregunta es: una vez que se ha preparado una consulta, usando sqlite3_prepare_v2(), y enlazado con parámetros usando sqlite3_bind_xyz(), ¿hay alguna forma de obtener una cadena que contenga la consulta SQL original?Obtener la consulta SQL original desde la instrucción preparada en SQLite

La razón es que cuando algo sale mal, me gustaría imprimir la consulta (para la depuración, esta es una aplicación de prueba para desarrolladores internos).

Ejemplo:

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

puntos de bonificación si también podría imprimir los parámetros reales que estaba destinada. :)

Respuesta

3

Según los comentarios en sqlite3.c (amalgamación), sqlite3_sql(myQuery) devolverá el texto SQL original.

No veo ninguna función para encontrar el valor vinculado a un índice en particular, pero podemos agregar fácilmente uno al conjunto estándar de funciones de SQLite. Puede ser algo como esto:

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

Bueno, el código anterior muestra únicamente una posible sqlite3_bound_value direcciones() podría ser implementado. No lo he probado, podría estar mal, pero da ciertas pistas sobre cómo/dónde comenzar.

+0

gracias por la respuesta, lo intentaré –

+0

esto fue todo lo que se pudo hacer sin hacer demasiado hackeo. Estoy aceptando, ya que no parece haber una manera adecuada de hacer lo que originalmente quería. –

1

Citando la documentación:

En las interfaces "V2", la declaración preparada que se devuelve (el objeto sqlite_stmt) contiene una copia del texto original de SQL.

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

4

es probable que desee utilizar sqlite3_trace

Para ello, será una función de devolución de llamada (que se define) y el de los parámetros es un char * del SQL de las declaraciones preparadas (incluyendo parámetros vinculados)

Cuestiones relacionadas