2017-10-12 4 views
0

Dans mon C-programme, je dois exécuter la commande pragma suivante:Comment exécuter les commandes 'PRAGMA' SQLite3 via C-API?

const char *sql = "PRAGMA table_info(family)"; /* 'family' is the table name */ 

Mais si je tente de lancer cette sql via sqlite3_exec() routine de routine ou sqlite3_prepare_v2(), mon programme cesse de répondre/travail à Windows invite de commande (C'est un simple 'programme de console' en langage C).

Fait intéressant, quand je lance cette même pragma sql à commande rapide normalement en exécutant le sqlite3.exe lui-même, il fonctionne très bien et donne une sortie suivante:

sqlite> pragma table_info(family); 
cid   name  type  notnull  dflt_value pk 
---------- ---------- ---------- ---------- ---------- ---------- 
0   id   INTEGER  0      1 
1   name  TEXT  1      0 
2   nickname TEXT  1      0 
3   dob   TEXT  1   CURRENT_TI 0 

Mais dans mon propre c-programme, il ne le fait pas. J'ai fait un peu de recherche sur ce problème. La documentation Google et Googling pointent vers this page here dans les documents officiels. Mais malheureusement, les informations fournies ne m'ont pas permis de résoudre le problème. Comment pouvons-nous exécuter avec succès les commandes SQLite3 'PRAGMA' via C-API?

EDIT: Voici les lignes de code problématiques. OU MCVE

J'ai trouvé les raisons de l'échec de mon programme, et avoir fixé (Avec l'aimable autorisation d'indices et conduit à Murphy's answer. Mais pour ceux qui sont intéressés à reproduire le problème, voici les lignes réelles de code qui ont été à l'origine programme À l'intérieur de ma fonction de rappel pour sqlite3_exec() routine, j'ai eu ce morceau de code (for-loop) pour l'impression des caractères '----------' ci-dessous les noms de colonnes pour imiter ".mode column" & " .headers on "style de sortie dans la console sqlite3.

 int h;  
     for(h=0; h <= (strlen(col_value[i])+5); h++) 
      printf("-"); 

Le problème a été provoqué par strlen() lors de l'impression de 'headers' pour la colonne de résultats PRAGMA sql dflt_value qui est null pour les trois premières colonnes de ma table. Si je cesse d'exécuter strlen() sur dflt_value. le programme fonctionne bien. De même, dans le problème de routine sqlite3_prepare_v2() a été causé par les lignes suivantes:

 int h;  
     for(h=0; h <= (strlen(sqlite3_column_text(stmt, 4))+5); h++) 
      printf("-"); 

Si je supprimer ou commenter ces lignes, tout fonctionne bien - mais sans le style « .headers on ».

Répondre

0

sqlite3_exec() devrait en effet être le chemin à parcourir pour exécuter des commandes pragma. Vous n'avez pas donné un MCVE (honte à vous!), Mais je soupçonne que vous négligez les valeurs d'erreur de manipulation, ou quelque chose d'autre ne va pas avec votre code. Vous devriez essayer de le déboguer.

+0

Merci pour les indices et les pistes. J'ai fourni MCVE, Et à qui cela peut concerner: sqlite3_exec() et sqlite3_prepare_v2(), les deux routines fonctionnent. :) – FAQi