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:查询结果,一维数组
例子:
选课管理系统
#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;
}