sqlite подготовил операторы - как отлаживать - PullRequest
10 голосов
/ 24 февраля 2009

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

Как проверить 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

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

Ответы [ 4 ]

6 голосов
/ 24 февраля 2009

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

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

"SELECT * FROM foo WHERE name = ?"

В противном случае SQLite не заменит знак вопроса, а будет обрабатывать его как строку "?".

1 голос
/ 08 июля 2011

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

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);
1 голос
/ 24 февраля 2009

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

Кроме того, теряйте точку с запятой в конце SELECT.

0 голосов
/ 24 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...