1、打开/创建一个数据库

  int sqlite3_open(const char *filename,  sqlite3 **ppDb );

功能:打开数据库链接
参数:filename:数据库的路径和文件名
ppdb:数据库句柄。
返回:成功  SQLITE_OK (值为0),否则返回其他值。

2、回调函数执行sql语句

int sqlite3_exec(sqlite3* pDB, const char *sql, sqlite_callback callback, void*para, char** errMsg);

功能:编译和执行零个或多个SQL 语句,查询的结果返回给回调函数callback
参数:
pDB,数据库句柄。
sql,待执行的SQL 语句字符串,以’\0’结尾。
callback,回调函数,用来处理查询结果,如果不需要回调(比如做insert 或者delete 操作时),可以输入NULL。
para,要传入回调函数的指针参数,没有可以置为NULL。
errMsg,返回错误信息,注意是指针的指针。

返回值:执行成功返回SQLITE_OK,否则返回其他值

3、回调函数

 typedef int (*sqlite_callback)(void* para,  int columnCount,  char** columnValue,char** columnName);

功能:由用户处理查询的结果
参数:
para,从sqlite3_exec()传入的参数指针;
columnCount, 查询到的这一条记录有多少个字段(即这条记录有多少列);
columnValue,查询出来的数据都保存在这里,它实际上是个1 维数组(不要以为是2 维数组),每一个元素都是一个char * 值,是一个字段内容(用字符串来表示,以‘\0’结尾);
columnName,与columnValue 是对应的,表示这个字段的字段名称。
返回值:执行成功返回SQLITE_OK,否则返回其他值

4、关闭

  int sqlite3_close(sqlite3 *ppDb);

功能:关闭数据库。
参数:ppdb:数据库句柄。

5、释放

void sqlite3_free(void * errMsg );

功能:释放存放错误信息的内存空间
参数:errMsg: 返回错误信息

6、    非回调来执行sql语句

int sqlite3_get_table(sqlite3 *db,          /* An open database */const char *zSql,     /* SQL to be evaluated */char ***pazResult,    /* Results of the query */int *pnRow,           /* Number of result rows written here */int *pnColumn,        /* Number of result columns written here */char **pzErrmsg       /* Error msg written here */);

功能:非回调来执行sql语句
db:数据库句柄
zSql:要执行的SQL语句
pazResult:查询结果,一维数组
pnRow:查询出多少条记录(查出多少行)
pnColumn:多少个字段(查出多少列)
pzErrmsg:错误信息

返回值:执行成功返回SQLITE_OK,否则返回其他值

注:pazResult的字段值是连续的,是以为数组不是二维数组,从第0索引到第 pnColumn- 1索引都是字段名称,从第 pnColumn索引开始,后面都是字段。

7、释放pazResult查询结果

 sqlite3_free_table(char ***pazResult);

参数:pazResult:查询结果,一维数组

例子:

选课管理系统

  1. 支持学生信息录入功能 学生表(学生学号,学生姓名,学生性别, 健康指数<int>)。
  2. 支持老师信息录入功能 教师表(老师ID,老师姓名,老师性别, 课程名字) 一个老师只会教一门课。
  3. 支持学生信息查询功能(全查询,按性别分组查询group by,按学号降序查询order by,按性别分组查询男女各自的健康总指数 group by , having,模糊查询学号like)单表查询。
  4. (扩展)支持学生选课功能(可以选哪个老师上课) 选课表 (学生学号,老师ID)。
  5. (扩展)支持选课结果查询功能 join 。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "/home/sqlite/include/sqlite3.h"static int callback(void *NotUsed, int argc, char **argv, char **azColName){int i;for(i=0; i<argc;i++){printf("%s = %s\r\n", azColName[i], argv[i] ? argv[i] : "NULL");}printf("\r\n");return 0;
}void input_student_info(char *dbName){sqlite3 *db;             //sqlite3的数据库句柄char *zErrMsg = 0;          //错误信息char *sql = NULL;sql = (char *) malloc(sizeof(char)*100);//开辟缓存char *sel =  NULL;int id;int rc;char name[20];char sex[5];int health;rc = sqlite3_open(dbName, &db);       //打开数据库if( rc ){                            //成功为SQLITE_OK(值为0)fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);             //关闭数据库return;}printf("\n");printf("id(0000~9999)=     ");scanf("%d", &id);printf("name=              ");scanf("%s", name);printf("sex(m:man,w:women)=");scanf("%s", sex);printf("health(0~10)=      ");scanf("%d", &health);sprintf(sql, "INSERT INTO 'Student' VALUES(%d, '%s', '%s', %d);", id, name, sex, health);sqlite3_exec( db , sql , callback , 0 , &zErrMsg );printf("SELECT:\n");sel = "SELECT * FROM Student;";sqlite3_exec( db , sel , callback , 0 , &zErrMsg );sqlite3_close(db);if(sql !=NULL){free(sql);}
}void input_teacher_info(char *dbName){sqlite3 *db;             //sqlite3的数据库句柄char *zErrMsg = 0;          //错误信息char *sql = NULL;sql = (char *) malloc(sizeof(char)*100);//开辟缓存char *sel =  NULL;int rc;int id;char name[20];char sex[5];char course[20];rc = sqlite3_open(dbName, &db);      //打开数据库if( rc ){                            //成功为SQLITE_OK(值为0)fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);             //关闭数据库return;}printf("\n");printf("id(0000~9999)               =");scanf("%d", &id);printf("name                        =");scanf("%s", name);printf("sex(m:man,w:women)          =");scanf("%s", sex);printf("course(Math,Chinese,English)=");scanf("%s", course);sprintf(sql, "INSERT INTO 'Teacher' VALUES(%d, '%s', '%s', '%s');", id, name, sex, course);sqlite3_exec( db , sql , callback , 0 , &zErrMsg );printf("SELECT:\n");sel = "SELECT * FROM Teacher;";sqlite3_exec( db , sel , callback , 0 , &zErrMsg );sqlite3_close(db);if(sql !=NULL){free(sql);}
}void select_info(char *dbName){sqlite3 *db;                //sqlite3的数据库句柄char *zErrMsg = 0;          //错误信息int cmd2,rc;rc = sqlite3_open(dbName, &db);      //打开数据库if( rc ){                            //成功为SQLITE_OK(值为0)fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);             //关闭数据库return;}while(1){printf("Please choose:              \n    \1:select all information     \n    \2:select by sex              \n    \3:select by id DESC          \n    \4:select by health           \n    \5:like select by id          \n    \0:quit                       \n");         scanf("%d",&cmd2);switch(cmd2){case 1:{char *sql1="SELECT * FROM Student;";sqlite3_exec(db, sql1, callback, 0, &zErrMsg);break;}case 2:{printf("intput sex(m:man,w:women):");char s;int r;setbuf(stdin,NULL);//清缓存,如果不清除则会读取上次缓存中的'\n'r = scanf("%c",&s);//printf("r=%d\n",r);char sql2[100]={};sprintf(sql2, "SELECT * FROM 'Student' WHERE sex = '%C';",s);sqlite3_exec(db, sql2, callback, 0, &zErrMsg);break;}case 3:{char *sql3="SELECT * FROM Student ORDER BY id DESC;";sqlite3_exec(db, sql3, callback, 0, &zErrMsg);break;}case 4:{printf("intput sex(m:man,w:women):");char sql4[100]={};char c;setbuf(stdin,NULL);scanf("%c",&c);sprintf(sql4, "SELECT SUM(health) FROM Student GROUP BY sex having sex = '%c';",c);sqlite3_exec(db, sql4, callback, 0, &zErrMsg);break;}case 5:{printf("intput id:");char sql5[100]={};int i;setbuf(stdin, NULL);scanf("%d",&i);sprintf(sql5, "SELECT * FROM Student WHERE id LIKE '%%%d%%';", i);//注意%sqlite3_exec(db, sql5, callback, 0, &zErrMsg);break;}case 0:{//break;return;}default:{printf("please choose right num\n");break;}}     }sqlite3_close(db);
}void select_course(char *dbName){sqlite3 *db;              //sqlite3的数据库句柄char *zErrMsg = 0;          //错误信息char *sel = NULL;char *sel2 = NULL;char *sql = NULL;int cmd3,rc, ret;int stu_id, teacher_id,flag=0;int i, j;int nRow, nCol;char **azResult;sql = (char *) malloc(sizeof(char)*100);//开辟缓存rc = sqlite3_open(dbName, &db);        //打开数据库if( rc ){                            //成功为SQLITE_OK(值为0)fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);             //关闭数据库return;}
start:printf("input student id:");scanf("%d",&stu_id);sel = "SELECT * FROM Student;";sqlite3_get_table(db, sel, &azResult, &nRow, &nCol, &zErrMsg);// azResult的字段值是连续的,从第0索引到第 nCol - 1索引都是字段名称,从第 nCol 索引开始,后面都是字段值for(i=1; i <= nRow; i++){//printf("id=%s\n",azResult[i*nCol]);if(atoi(azResult[i*nCol]) == stu_id){printf("find the student id=%d\n",stu_id);flag =1;break;}}if(0 == flag){printf("please input right student id\n");goto start;}if(1 == flag){sel2 = "SELECT * FROM Teacher;";printf("\n******the teacher info:******\n");sqlite3_exec(db, sel2, callback, 0, &zErrMsg);printf("*******************************\n");printf("please choose teacher id:");scanf("%d",&teacher_id);sprintf(sql, "INSERT INTO Course VALUES('%d', '%d');", stu_id, teacher_id);ret = sqlite3_exec(db, sql, callback, 0, &zErrMsg);if(ret == SQLITE_OK){printf("select success\n\n");}if(ret!=SQLITE_OK){fprintf(stderr, "SQL error: %s\n\n", zErrMsg);sqlite3_free(zErrMsg);}}sqlite3_free_table(azResult);//释放查询结果sqlite3_close(db);
}void select_all(char *dbName){sqlite3 *db;             //sqlite3的数据库句柄char *zErrMsg = 0;          //错误信息char *sql = NULL;int rc,sel_id;sql = (char *) malloc(sizeof(char)*100);//开辟缓存rc = sqlite3_open(dbName, &db);       //打开数据库if( rc ){                            //成功为SQLITE_OK(值为0)fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);             //关闭数据库return;}printf("please choose           \n    \1:select result by student id    \n    \2:select result by teacher id   \n    \0:quit                            \n");
start:setbuf(stdin,NULL);scanf("%d",&sel_id);switch(sel_id){case 1:{printf("student id:");int stu_id;setbuf(stdin,NULL);scanf("%d",&stu_id);sprintf(sql, "SELECT * FROM Student LEFT JOIN Course ON Student.ID = Course.StuID WHERE Student.ID='%d'",stu_id);sqlite3_exec( db , sql , callback ,0, &zErrMsg );break;}case 2:{printf("teacher id:");int teacher_id;setbuf(stdin,NULL);scanf("%d",&teacher_id);sprintf(sql, "SELECT * FROM Teacher LEFT JOIN Course ON Teacher.ID = Course.TeacherID WHERE Teacher.ID='%d'",teacher_id);sqlite3_exec( db , sql , callback ,0, &zErrMsg );break;}case 0:{return;}default:{printf("please input right num\n");goto start;}}sqlite3_close(db);
}// ./main ./data.db
int main(int argc, char **argv){sqlite3 *db;            //sqlite3的数据库句柄char *zErrMsg = 0;  //错误信息int cmd, rc;char *sel = NULL;if( argc!=2 ){fprintf(stderr, "Usage: %s DATABASE \n", argv[0]);//stderr是Unix中的标准输出return 0;}rc = sqlite3_open(argv[1], &db);   //打开数据库if( rc ){                            //成功为SQLITE_OK(值为0)fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);             //关闭数据库return 0;}//学生信息表char *sql = " CREATE TABLE Student(              \ID INTEGER PRIMARY KEY,    \Name VARCHAR(20),          \Sex  VARCHAR(5),           \Health   INTEGER           \);";sqlite3_exec( db , sql , callback ,0, &zErrMsg );//老师信息表sql = " CREATE TABLE Teacher(               \ID INTEGER PRIMARY KEY,    \Name VARCHAR(20),          \Sex  VARCHAR(5),           \CourseName   VARCHAR(20)   \);";sqlite3_exec( db , sql , callback ,0, &zErrMsg );//课程信息表sql = " CREATE TABLE Course(            \StuID INTEGER,             \TeacherId INTEGER          \);";sqlite3_exec( db , sql , callback ,0, &zErrMsg );while(1){//start:printf("Please choose:       \n    \1:Input student information  \n    \2:Input teacher information  \n    \3:Information query function \n    \4:select Teacher Course      \n    \5:select all Course          \n    \0:quit                       \n");scanf("%d", &cmd);switch(cmd){case 1:{input_student_info(argv[1]);break;}case 2:{input_teacher_info(argv[1]);break;}case 3:{select_info(argv[1]);break;}case 4:{select_course(argv[1]);break;}case 5:{select_all(argv[1]);break;}case 0:{goto end;//break;}default:{printf("please choose right num\n");break;}}}end:if( rc!=SQLITE_OK ){fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);//释放存放错误信息的内存空间}sqlite3_close(db);//关闭return 0;
}

sqlite3入门基础、sqlite3常用函数相关推荐

  1. 电子元器件从入门到精通pdf_电子元件入门基础,常用电子元器件详解大全作用-涨知识必读...

    1.电子元器件筛选的必要性 电子元器件的固有可靠性取决于产品的可靠性设计, 在产品的制造过程中, 由于人为因素或原材料. 工艺条件. 设备条件的波动, 最终的成品不可能全部达到预期的固有可靠性. 在每 ...

  2. 数字化方法基础_常用函数

    数字化方法基础_常用函数 1. 叉乘 2. 单位化矢量 3. 矩阵乘法4×4 × 4×1 4. 矩阵乘法 4×4 × 4×4 1. 叉乘 void crossproject(float vec1[3] ...

  3. Arduino基础与常用函数

    文章目录 1. Arduino语言 2. Arduino代码结构 1.类似于C的头文件包含,变量定义等 2.void setup() 3.void loop() 3.串口常用函数 1.串口收发函数 S ...

  4. js list添加元素_JS基础与常用函数

    JavaScript是没有Print()方法的. 所以要做内容输出,需要用到console.log(xxx) 控制台输出. Chrome浏览器中就可以编写代码,或者在编译器中,写纯JavaScript ...

  5. [转载] python 语言基础 - 字符串常用函数及操作

    参考链接: Python字符串| ljust rjust center python为字符串操作提供了很多常用的内建函数,让我们在操作字符串时能够更加简单方便. 下面以某个字符串为例来一一介绍一下 现 ...

  6. zookeeper入门 - 3 - API常用函数功能与参数详解

    <zooker入门系列教程>: 1 - 如何在单机上实现ZooKeeper伪机群/伪集群部署 2 - 解读zookeeper的配置项 1. zookeeper初始化 zhandle_t * ...

  7. Oracle 快速入门 110个常用函数

    1. ASCII 返回与指定的字符对应的十进制数; SQL> select ascii(A) A,ascii(a) a,ascii(0) zero,ascii( ) space from dua ...

  8. Python入门基础知识点 (初识函数)

    什么是函数 然后现在有一个需求,让你计算'hello world'的长度,len方法突然不能直接用,你怎么计算? s1 = "hello world" length = 0 for ...

  9. Arduino编程基础与常用函数(详细)解析

    Arduino编程基础 关键字: if.if-else.for.switch.case.while.do-while.break.continue.return.goto. 语法符号:每条语句以&qu ...

最新文章

  1. Log4J配置方式Java工程测试
  2. python 等比例缩放图片 自写
  3. 太阳的光和灯光有什么区别_墙体彩绘机UV(油性)和水性墨水怎么选择?有什么区别?...
  4. matlab按顺序排列图片,小技巧
  5. 前端月趋势榜:9 月最新上榜的、热门的 10 个前端开源项目 - 2109
  6. angular跳转指定页面_通过 angular CDK 实现页面元素拖放
  7. 关于CMMI和PMBOK之间的关系和区别比较
  8. OSChina 周二乱弹 ——胸大的烦恼!
  9. 下载量超1600万的热门开源 JavaScript 序列化包中被曝 RCE 漏洞
  10. 鬼谷八荒先天气运修改器
  11. 普通用户申请微软的OneDrive免费网盘,容量5T、5T、5T,重要事情说三遍!!!!!
  12. python基础知识相关习题
  13. 01时态(1):疑问句
  14. getReader()/getInputStream() has already been called for this request
  15. 从阿里跳槽来的工程师,写个try catch的方式都这么优雅!
  16. Java面向对象实例(双色球摇号篇)
  17. android安卓导航下载地址,安卓导航辅助软件:Android搜星帮助文件
  18. 肖秀荣、陆寓丰、徐涛三大名师的正确“打开方式”
  19. Chrome浏览器不显示京东商品价格解决方法
  20. 微信、支付宝先后发布声明!

热门文章

  1. 入围名单 | “麒麟杯”20支赛队开启决赛终极PK​!
  2. 政府网站从管理型向服务型政府网站的转变过程中
  3. Python学习(作业第一周)
  4. 自然语言处理——命名实体识别
  5. IDC最新MarketScape报告:DevOps市场需求广泛
  6. JavaScript中格式化Date类型
  7. vue 学习笔记第无弹
  8. java软件学习网站_Java程序员必看的十大学习网站
  9. 有关于联想电脑的无线开启功能
  10. Windows下用HackRF和SDR#收听FM