2010-09-15 3 views
3

Existe-t-il un moyen de voir ce que 'showStatement' est après sqlite3_prepare_v2 et sqlite3_bind_xxx?Débogage de sqlite

L'exécution de cette requête:

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 

fonctionne parfaitement dans SQLite Manager et dans le code quand je rentre EXACTEMENT comme ça. Si je fais cependant substitution de paramètre la requête renvoie aucun résultat ...

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) { 

...

Le problème doit se situer dans le IN (6,7 ...) partie, sans que cela fonctionne parfaitement .

Mon débogueur me montre que Forday = 1 et que allFavorites = 6,7,15,19,23,66 mais l'erreur = 101 = sqlite3_step() a terminé son exécution = aucune ligne trouvée

Pouvoir pour voir la variable 'showStatement' d'une manière ou d'une autre résoudrait le problème, cependant le débogueur ne donne pas cette information

+0

duplication possible de [Obtenir la requête SQL d'origine de l'instruction préparée dans SQLite] (http://stackoverflow.com/questions/1397924/get-original-sql-query-from-prepared-statement-in-sqlite) –

Répondre

1

Vous ne pouvez pas lier IN (?) avec un tableau.

Vous devez écrire shows.id IN (?, ?, ?, ?, ?, ?) et lier chaque paramètre séparément. Le nombre de points d'interrogation doit également correspondre au nombre de paramètres, de sorte que vous devrez peut-être construire la requête de manière dynamique si le nombre peut varier.

+0

Remerciements vous beaucoup, cela a résolu le problème. Cependant, pour le futur, est-il possible de "voir" via le débogueur ce qui se trouve dans mon "showStatement" après la liaison? (serait pratique pour déboguer) – Glenn

+0

@Glenn: Je ne sais pas désolé. :(Mais je peux deviner que cela ressemble probablement à ceci: 'IN ('6,7,15,19,23,66')', c'est-à-dire une seule chaîne, pas une liste d'entiers. –