sqlite3入门基础、sqlite3常用函数
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:查询结果,一维数组
例子:
选课管理系统
- 支持学生信息录入功能 学生表(学生学号,学生姓名,学生性别, 健康指数<int>)。
- 支持老师信息录入功能 教师表(老师ID,老师姓名,老师性别, 课程名字) 一个老师只会教一门课。
- 支持学生信息查询功能(全查询,按性别分组查询group by,按学号降序查询order by,按性别分组查询男女各自的健康总指数 group by , having,模糊查询学号like)单表查询。
- (扩展)支持学生选课功能(可以选哪个老师上课) 选课表 (学生学号,老师ID)。
- (扩展)支持选课结果查询功能 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常用函数相关推荐
- 电子元器件从入门到精通pdf_电子元件入门基础,常用电子元器件详解大全作用-涨知识必读...
1.电子元器件筛选的必要性 电子元器件的固有可靠性取决于产品的可靠性设计, 在产品的制造过程中, 由于人为因素或原材料. 工艺条件. 设备条件的波动, 最终的成品不可能全部达到预期的固有可靠性. 在每 ...
- 数字化方法基础_常用函数
数字化方法基础_常用函数 1. 叉乘 2. 单位化矢量 3. 矩阵乘法4×4 × 4×1 4. 矩阵乘法 4×4 × 4×4 1. 叉乘 void crossproject(float vec1[3] ...
- Arduino基础与常用函数
文章目录 1. Arduino语言 2. Arduino代码结构 1.类似于C的头文件包含,变量定义等 2.void setup() 3.void loop() 3.串口常用函数 1.串口收发函数 S ...
- js list添加元素_JS基础与常用函数
JavaScript是没有Print()方法的. 所以要做内容输出,需要用到console.log(xxx) 控制台输出. Chrome浏览器中就可以编写代码,或者在编译器中,写纯JavaScript ...
- [转载] python 语言基础 - 字符串常用函数及操作
参考链接: Python字符串| ljust rjust center python为字符串操作提供了很多常用的内建函数,让我们在操作字符串时能够更加简单方便. 下面以某个字符串为例来一一介绍一下 现 ...
- zookeeper入门 - 3 - API常用函数功能与参数详解
<zooker入门系列教程>: 1 - 如何在单机上实现ZooKeeper伪机群/伪集群部署 2 - 解读zookeeper的配置项 1. zookeeper初始化 zhandle_t * ...
- Oracle 快速入门 110个常用函数
1. ASCII 返回与指定的字符对应的十进制数; SQL> select ascii(A) A,ascii(a) a,ascii(0) zero,ascii( ) space from dua ...
- Python入门基础知识点 (初识函数)
什么是函数 然后现在有一个需求,让你计算'hello world'的长度,len方法突然不能直接用,你怎么计算? s1 = "hello world" length = 0 for ...
- Arduino编程基础与常用函数(详细)解析
Arduino编程基础 关键字: if.if-else.for.switch.case.while.do-while.break.continue.return.goto. 语法符号:每条语句以&qu ...
最新文章
- Log4J配置方式Java工程测试
- python 等比例缩放图片 自写
- 太阳的光和灯光有什么区别_墙体彩绘机UV(油性)和水性墨水怎么选择?有什么区别?...
- matlab按顺序排列图片,小技巧
- 前端月趋势榜:9 月最新上榜的、热门的 10 个前端开源项目 - 2109
- angular跳转指定页面_通过 angular CDK 实现页面元素拖放
- 关于CMMI和PMBOK之间的关系和区别比较
- OSChina 周二乱弹 ——胸大的烦恼!
- 下载量超1600万的热门开源 JavaScript 序列化包中被曝 RCE 漏洞
- 鬼谷八荒先天气运修改器
- 普通用户申请微软的OneDrive免费网盘,容量5T、5T、5T,重要事情说三遍!!!!!
- python基础知识相关习题
- 01时态(1):疑问句
- getReader()/getInputStream() has already been called for this request
- 从阿里跳槽来的工程师,写个try catch的方式都这么优雅!
- Java面向对象实例(双色球摇号篇)
- android安卓导航下载地址,安卓导航辅助软件:Android搜星帮助文件
- 肖秀荣、陆寓丰、徐涛三大名师的正确“打开方式”
- Chrome浏览器不显示京东商品价格解决方法
- 微信、支付宝先后发布声明!