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
».
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