2009-02-24 2 views
9

Я пишу код C++, который использует библиотеку sqlite3. Я использую подготовленный оператор, к которому я привязываю переменную во время выполнения.sqlite подготовленные операторы - как отлаживать

Как проверить SQL-запрос в инструкции после привязки?

Например, приведенный ниже код не возвращает строку. При использовании готовой строки и sqlite3_exec я получаю ожидаемые результаты.

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 

Редактировать: Как указано Фердинандом ниже, проблема в запросе выше - это цитаты вокруг. Однако в будущем мне все равно хотелось бы узнать, как проверить sqlite3_stmt для фактического запроса, который будет выполнен.

ответ

1

Третий параметр sqlite3_bind_text должен быть значением, которое вы хотите привязать, - в коде, который вы пытаетесь связать с запросом, сам по себе!

Также потеряйте точку с запятой в конце SELECT.

+0

К сожалению, была опечатка при написании вопроса. Итак, нет, это не настоящая проблема, извините –

+0

Я считаю, что нужна запятая –

6

SQL-запрос не изменяется после привязок - ваши переменные не вставлены в строку SQL или что-то еще.

В дополнение к тому, что сказал Нил, оставьте кавычки вокруг? заполнитель:

"SELECT * FROM foo WHERE name = ?" 

В противном случае SQLite не заменит знак вопроса, а обработает его как строку «?».

+1

Спасибо, проблема была действительно кавычками вокруг. –

+0

Я знаю, что строка sql не изменяется (в конце концов я объявлял ее const). НО, утверждение меняется. Есть ли способ увидеть, какой запрос будет отправляться в БД после привязки, если посмотреть на утверждение? –

+0

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

-1

Не знаю, что такое sqlite, но реальный запрос может быть зарегистрирован или вы можете перевернуть переключатель, чтобы его можно было зарегистрировать.

1

Да, вы можете сделать это путем определения функции профиля, как это:

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

Затем сразу же после открытия базы данных с помощью sqlite3_open, сделать этот вызов:

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

Я просто попробовал это; он не показывает результат привязок, поскольку op, кажется, желает. – kasterma

+0

Хорошее предложение, но не показывает привязанные аргументы – inversus

Смежные вопросы