根底操作
关上数据库文件
- int sqlite3_open(const char filename, sqlite3 ppDb);
该例程关上一个指向 SQLite 数据库文件的连贯,返回一个用于其余 SQLite 程序的数据库连贯对象。
如果 filename 参数是 NULL 或 ':memory:',那么 sqlite3_open() 将会在 RAM 中创立一个内存数据库,这只会在 session 的无效工夫内继续。
如果文件名 filename 不为 NULL,那么 sqlite3_open() 将应用这个参数值尝试关上数据库文件。如果该名称的文件不存在,sqlite3_open() 将创立一个新的命名为该名称的数据库文件并关上。
操作数据(执行 sql 语句)
- int sqlite3_exec(sqlite3,const char sql,sqlite_callback,void ,char errmsg);
该例程提供了一个执行 SQL 命令的快捷方式,SQL 命令由 sql 参数提供,能够由多个 SQL 命令组成。
在这里,第一个参数 sqlite3 是关上的数据库对象,_sqlite_callback_ 是一个回调,_data_ 作为其第一个参数,errmsg 将被返回用来获取程序生成的任何谬误。
sqlite3_exec() 程序解析并执行由 sql 参数所给的每个命令,直到字符串完结或者遇到谬误为止。
敞开数据库
- int sqlite3_close(sqlite3*);
该例程敞开之前调用 sqlite3_open() 关上的数据库连贯。所有与连贯相干的语句都应在连贯敞开之前实现。
如果还有查问没有实现,sqlite3_close() 将返回 SQLITE_BUSY 禁止敞开的谬误音讯。
编程试验
#include <stdio.h>#include <sqlite3.h>int main(){ // 1. 关上数据库 sqlite3 *ppdb = NULL; int ret = sqlite3_open("test.db", &ppdb); if (ret != SQLITE_OK) { printf("open fail\n"); return -1; } // 2. 执行 sql 语句 // 2.1 创建表格 create table apitest(id int, number int); const char *create_sql = "create table apitest(id int, number int)"; char *errmsg = NULL; ret = sqlite3_exec(ppdb, create_sql, NULL, NULL, &errmsg); if (ret != SQLITE_OK) { printf("%s\n", errmsg); } sqlite3_free(errmsg); // 2.2 插入数据 insert into apitest(id int, number int) const char *insert_sql = "insert into apitest values(0, 20200727)"; ret = sqlite3_exec(ppdb, insert_sql, NULL, NULL, &errmsg); if (ret != SQLITE_OK) { printf("%s\n", errmsg); } sqlite3_free(errmsg); // 3. 敞开数据库 ret = sqlite3_close(ppdb); if (ret != SQLITE_OK) { printf("close fail\n"); } return 0;}
回调函数查问
#include <stdio.h>#include <sqlite3.h>/* *@brief:数据查问回调函数,有多少行数据被调用多少次(返回值始终为0时) *@param:arg: 由 sqlite3_exec 第 4 个参数传入 *@param:cols: 查问到的数据的列数 *@param:values: 一行数据字段值 *@param:names: 一行数据字段明 *@retval: 0 持续查问 *@retval: 1 终止查问 **/int callback(void *arg, int cols, char **values, char **names) // 留神这里!!!{ (void)(arg); static int flag = 0; if (flag == 0) { printf("cols = %d\n", cols); for (int i=0; i<cols; ++i) printf("%s\t", names[i]); flag = 1; } printf("\n"); for (int i=0; i<cols; ++i) printf("%s\t", values[i]); return 0;}int main(){ // 1. 关上数据库 sqlite3 *ppdb = NULL; int ret = sqlite3_open("test.db", &ppdb); if (ret != SQLITE_OK) { printf("open fail\n"); return -1; } // 2. 执行 sql 语句 // 2.1 创建表格 create table apitest(id int, number int); const char *create_sql = "create table if not exists apitest(id int, number int)"; char *errmsg = NULL; ret = sqlite3_exec(ppdb, create_sql, NULL, NULL, &errmsg); if (ret != SQLITE_OK) { printf("%s\n", errmsg); } sqlite3_free(errmsg); // 2.2 插入数据 insert into apitest(id int, number int) const char *insert_sql = "insert into apitest values(0, 20200727)"; ret = sqlite3_exec(ppdb, insert_sql, NULL, NULL, &errmsg); if (ret != SQLITE_OK) { printf("%s\n", errmsg); } sqlite3_free(errmsg); // 2.3 回调函数查问 const char *select_sql = "select * from apitest"; ret = sqlite3_exec(ppdb, select_sql, callback, NULL, &errmsg); // 留神这里!!! if (ret != SQLITE_OK) { printf("select fail\n"); } sqlite3_free(errmsg); // 3. 敞开数据库 ret = sqlite3_close(ppdb); if (ret != SQLITE_OK) { printf("close fail\n"); return -1; } return 0;}
输入:
cols = 2id number0 202007270 202007270 202007270 202007270 202007270 202007270 202007270 202007270 202007270 202007270 202007270 20200727
非回调函数查问
- int sqlite3_get_table(sqlite3* ppdb,const char *sql,char ***resultp,int *nrow,int *ncolumn,char **errmsg);
注:在查问大数据量时不举荐应用,将导致大量的堆空间被应用。
返回值:SQLITE_OK 胜利参数: sqlite3* ppdb : 数据库句柄 const char *sql : sql查问语句 char ***resultp : 查问的到的数据表 int *nrow : 查到数据表的行 int *ncolumn : 查到的数据表的列 char **errmsg : 存储谬误sqlite3_free_table(resultp);//应用后要开释sqlite3_free(errmsg)
#include <stdio.h>#include <sqlite3.h>int main(){ // 1. 关上数据库 sqlite3 *ppdb = NULL; int ret = sqlite3_open("test.db", &ppdb); if (ret != SQLITE_OK) { printf("open fail\n"); return -1; } // 2. 执行 sql 语句 // 2.1 创建表格 create table apitest(id int, number int); const char *create_sql = "create table if not exists apitest(id int, number int)"; char *errmsg = NULL; ret = sqlite3_exec(ppdb, create_sql, NULL, NULL, &errmsg); if (ret != SQLITE_OK) { printf("%s\n", errmsg); } sqlite3_free(errmsg); // 2.2 插入数据 insert into apitest(id int, number int) const char *insert_sql = "insert into apitest values(0, 20200727)"; ret = sqlite3_exec(ppdb, insert_sql, NULL, NULL, &errmsg); if (ret != SQLITE_OK) { printf("%s\n", errmsg); } sqlite3_free(errmsg); // 2.3 非回调函数查问 char **resultp = NULL; int row, col; ret = sqlite3_get_table(ppdb, "select * from apitest", &resultp, &row, &col, &errmsg); if (ret == SQLITE_OK) { printf("%d:%d\n", row, col); for (int i=0; i<(row+1); ++i) // 留神这里的拜访范畴 !!! { for (int j=0; j<col; ++j) { printf("%s\t", resultp[i * col +j]); // 留神这里的字符拜访!!! } printf("\n"); } } else { printf("%s\n", errmsg); } sqlite3_free(errmsg); sqlite3_free_table(resultp); // 3. 敞开数据库 ret = sqlite3_close(ppdb); if (ret != SQLITE_OK) { printf("close fail\n"); return -1; } return 0;}
输入:
14:2id number0 202007270 202007270 202007270 202007270 202007270 202007270 202007270 202007270 202007270 202007270 202007270 202007270 202007270 20200727
查问后果构造阐明: