Отладка sqlite

Есть ли способ увидеть, что получается в результате «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 и allFavorites = 6,7,15,19,23,66, но ошибка = 101 = sqlite3_step() завершила выполнение = строки не найдены

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


person Glenn    schedule 15.09.2010    source источник


Ответы (1)


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

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

person Mark Byers    schedule 15.09.2010
comment
Большое спасибо, это решило проблему. Однако в будущем я могу каким-либо образом «увидеть» через отладчик, что находится в моем «showStatement» после привязки? (было бы удобно отлаживать) - person Glenn; 15.09.2010
comment
@Glenn: не знаю, извини. :( Но я могу предположить, что это, вероятно, выглядит так: IN ('6,7,15,19,23,66'), т.е. одна строка, а не список целых чисел. - person Mark Byers; 15.09.2010