2010-05-31 4 views
3

Je dois insérer une chaîne dans une base de données SQLite ma commande ..Comment insérer une chaîne dans sqlite3 dans c

Err=sqlite_exec(DB, "create table tbl5(TEXT varchar(100));", xCallback, (void*)"First Test", &ErrMsg); 

Err=sqlite_exec(DB, "insert into tbl5 values ('some string');", xCallback, (void*)"First Test", &ErrMsg); 

fonctionne très bien, mais quand je veux mettre s="some string"-à-dire

Err=sqlite_exec(DB, "insert into tbl5 values (s);", xCallback, (void*)"First Test", &ErrMsg); 

alors ce ne fonctionne pas alors comment ajouter une variable, alors il ne fonctionne pas alors comment insérer variable dans la base de données SQLite thank u

Répondre

6

N'utilisez pas sprintf() mais sqlite3_mprintf(). Here est la documentation.

char s[20] = "some string"; 
char* query = sqlite3_mprintf("insert into tbl5 values ('%q');", s); 

Sinon, vous avez un risque de SQL injection.

La chaîne de requête résultante doit être libérée à l'aide de sqlite3_free().

Notez également le '%q' au lieu de l'habituel '%s'.

+0

Fonction intéressante, je ne savais pas qu'il existait. J'ai utilisé sqlite3 en C++, en utilisant la fonctionnalité 'std' pour construire mes requêtes. Par conséquent, je n'étais pas au courant de cette fonctionnalité orientée C. – Pieter

+0

@Pieter: En fait, je l'utilise aussi dans 'C++'. La documentation de sqlite n'est pas vraiment simple mais il semble que ce soit la seule façon de le faire en toute sécurité. – ereOn

0

Vous pourriez u sprintf pour créer une chaîne formatée.

char s[20] = "some string"; 
char query[100]; 
sprintf(query, "insert into tbl5 values (%s);", s); 

Il est à vous pour vous assurer que query est assez grand.

+0

Utiliser 'sprintf()' ici est probablement un mauvais conseil. Voyez ma réponse pour le "pourquoi". – ereOn

2

Outre les suggestions déjà fournies, vous pouvez également utiliser des instructions préparées avec des paramètres liés (ceci est également utile si vous avez l'intention de répéter l'instruction plusieurs fois avec des paramètres différents). voir le sqlite3_prepare_v2 et sqlite3_bind_* pour plus d'informations

sqlite3_stmt *stmt; 

// Create a prepared statement. 
Err = sqlite3_prepare_v2(DB, "insert into tbl5 values (?)", -1, &stmt, NULL); 
if (Err != SQLITE_OK) 
{ 
    //... 
} 

// Bind our string to the statement. 
Err = sqlite3_bind_text(stmt, 1, "some string", -1, SQLITE_TRANSIENT); 
if (Err != SQLITE_OK) 
{ 
    //... 
} 

// Execute the statement. 
Err = sqlite3_step(stmt); 
if (Err != SQLITE_DONE) 
{ 
    //... 
} 

// Free the prepared statement. 
Err = sqlite3_finalize(stmt); 
Questions connexes