2009-09-09 2 views
6

Я использую SQLite (3.6.4) из приложения C++ (с использованием стандартного C api). Мой вопрос: как только запрос был подготовлен, используя sqlite3_prepare_v2() и связанный с параметрами с помощью sqlite3_bind_xyz() - есть ли способ получить строку, содержащую исходный SQL-запрос?Получить исходный SQL-запрос из подготовленного оператора в SQLite

Причина в том, что что-то пошло не так, я хотел бы распечатать запрос (для отладки - это собственное тестовое приложение для разработчиков).

Пример:

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

Бонусные баллы, если он также может распечатать фактические параметры, которые были связанные. :)

ответ

3

Согласно комментариям в sqlite3.c (объединение), sqlite3_sql(myQuery) вернет исходный текст SQL.

Я не вижу никакой функции для определения привязки значения по определенному индексу, но мы можем легко добавить ее к стандартному набору функций SQLite. Это может выглядеть примерно так:

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

Ну, приведенный выше код показывает только возможный путь sqlite3_bound_value() может быть реализован. Я не тестировал его, это может быть неправильно, но он дает определенные подсказки о том, как и с чего начать.

+0

благодарит за ответ, я дам ему попробовать –

+0

, это было настолько далеко, насколько это было возможно, не делая слишком много взлома. Я принимаю, потому что, похоже, нет подходящего способа сделать то, что я изначально хотел. –

1

Цитируя документации:

В интерфейсах «v2», подготовленный оператор, который возвращается (объект sqlite_stmt) содержит копию исходного текста SQL.

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

4

Вы, вероятно, хотите использовать sqlite3_trace

Это вызовет функцию обратного вызова (который вы определили) и параметров является символ * в SQL подготовленных заявлений (в том числе связанных параметров).