常见sqlite3 API的简单使用(4)

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;
}

 

上一篇:Spring IoC 容器的扩展


下一篇:机器学习案例三:数据降维与相关性分析(皮尔逊(Pearson),二维相关性分析(TDC),灰色关联分析,最大信息系数(MIC))