Отладка sqlite - PullRequest
       1

Отладка sqlite

3 голосов
/ 15 сентября 2010

Есть ли способ узнать, что будет в результате 'showStatement' после sqlite3_prepare_v2 и sqlite3_bind_xxx?

Выполнение этого запроса:

SELECT * 
FROM shows, locations 
WHERE (shows.day_id = 1) 
  AND (shows.id IN (6,7,15,19,23,66)) 
  AND (shows.location_id = locations.id)
ORDER by locations.sort_order

отлично работает в SQLite Manager и в коде, когда я ввожу его ТОЧНО так. Однако, если я делаю подстановку параметров, запрос не возвращает результатов ...

if (sqlite3_open([databasePath UTF8String],&showsDatabase) == SQLITE_OK){
    const char *sqlStatement = "SELECT * FROM shows, locations WHERE (shows.day_id = ?) AND (shows.id IN (?)) AND (shows.location_id = locations.id) ORDER by locations.sort_order";
        sqlite3_stmt *showStatement;
        if(sqlite3_prepare_v2(showsDatabase, sqlStatement, -1, &showStatement, NULL) == SQLITE_OK) {
            sqlite3_bind_int(showStatement, 1, forDay);
            sqlite3_bind_text(showStatement, 2, allFavorites,-1,NULL);
            int error = sqlite3_step(showStatement);
            while(sqlite3_step(showStatement) == SQLITE_ROW) {

...

Проблема должна заключаться в части IN (6,7 ...), без которой она работает идеально.

Мой отладчик показывает мне, что forDay = 1 и что allFlected = 6,7,15,19,23,66 но ошибка = 101 = sqlite3_step () завершила выполнение = строки не найдены

Возможность увидеть переменную 'showStatement' тем или иным образом решит проблему, однако отладчик не предоставляет эту информацию

1 Ответ

1 голос
/ 15 сентября 2010

Невозможно связать IN (?) с массивом.

Вам нужно написать shows.id IN (?, ?, ?, ?, ?, ?) и связать каждый параметр отдельно. Количество вопросительных знаков также должно соответствовать количеству параметров, поэтому вам может потребоваться построить запрос динамически, если число может изменяться.

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