sqlite3_bind_****
int sqlite3_bind_text(sqlite3_stmt*,int,const char*,int,void(*)(void*));
sqlite3_bind_text是slite3_bind家族的一员。作用是将sqlite3_prepare_v2 中sql语句里的占为符 ? 替换成变量。
第一个参数是从sqlite3_prepare_v2中返回的stmt结构的指针pStmt;
第二个参数是要替换占位符的坐标,从1开始;
第三个参数是要替换的变量;
第四个参数简单使用写成-1;
第五个参数简单使用写成nullptr 或 SQLITE_STATIC。
使用这个API可以防止sql注入(会把占位符当成一个变量插入到表中)。
在大量更新,插入数据时,也非常高效。一般流程如下:
sqlite3_prepare_v2(); for(data : row){ sqlite3_bind_**(...data1...); sqlite3_bind_**(...data2...); .... sqlite3_step(); sqlite3_reset(); }
sqlite3_finalize()
简单实例
#include <iostream> #include <stdio.h> #include "sqlite3.h" using namespace std; int main() { const char *name = "jojo"; const char *password = "123456"; sqlite3 *db; sqlite3_stmt *pStmt; int rv; rv = sqlite3_open("./mdata.db", &db); if(rv != SQLITE_OK) goto error_exit; rv = sqlite3_prepare_v2(db, "insert into players values(?,?)", -1, &pStmt, nullptr); if(rv != SQLITE_OK) goto error_exit2; rv = sqlite3_bind_text(pStmt, 1, name, -1, SQLITE_STATIC); if(rv != SQLITE_OK) goto error_exit2; rv = sqlite3_bind_text(pStmt, 2, password, -1, SQLITE_STATIC); if(rv != SQLITE_OK) goto error_exit2; rv = sqlite3_step(pStmt); if(rv != SQLITE_DONE) goto error_exit2; sqlite3_finalize(pStmt); sqlite3_close; return 0; error_exit: sqlite3_close(db); fprintf(stderr, "can't open db\n"); return -1; error_exit2: sqlite3_finalize(pStmt); sqlite3_close(db); fprintf(stderr, "run error\n"); return -2; }