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:查询结果,一维数组
 

例子:

选课管理系统

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

猜你喜欢

转载自blog.csdn.net/King_weng/article/details/83352911
今日推荐