淘先锋技术网

首页 1 2 3 4 5 6 7

目录

一.数据库

二.SQlite数据库

1.SQlite的特点

2.SQlite3基本命令

①.系统命令(通常以 . 开头)

②.sql命令

3.SQlite编程

①打开数据库sqliite3_open

②关闭数据库sqlite3_close

③返回错误sqlite3_errmsg

④执行sql语句sqlite3_exec

⑤sqlite3_get_table

简易的学生成绩管理系统


一.数据库

数据是指能输入计算机并能被计算机程序识别和处理的信息集合;而数据库是在数据库管理系统和控制之下,存放在储存介质上的数据集合。

基于嵌入式的数据库:

Firebird:关系型数据库,功能强大,支持储存过程,SQL兼容等;

SQlite:关系型数据库,体积小,支持ACID事务;

Berkeley DB:中并没有数据库服务器的概念,它的程序直接链接到应用程序中;

eXtremeDB:内存数据库,运行效率高;

二.SQlite数据库

1.SQlite的特点

>零配置——无需安装和配置管理;

>储存在单一磁盘文件中的一个完整的数据库;

>数据库文件可以在不同字节顺序的机器间自由共享

>主持数据库大小至2TB

>足够小,全部源码大致3万行,250KB;

>操作较快

2.SQlite3基本命令

①.系统命令(通常以 . 开头)

>在终端下运行 sqlite3 < *.db > 指令:  <*.db> 是要打开的数据库文件。若该文件不存在,则自动创建

>显示当前打开的数据库文件.database

>显示数据库中所有表名.tables

>查看表的结构.schema <table_name>

>显示所有命令.help

②.sql命令

sql命令一般不以‘.’开头,但要以‘;’结尾

>创建一张数据库表stu

create table stu(id Integer,name char,score Integer);
>插入一条记录

insert into stu values(1001,'zhangsan',80);

部分插入:insert into stu(id,name)values(1001,lisi);

>查询记录

selcet * from stu;//查询所有的字段

select name,score fom stu;//查询部分字段

select * from stu where score=80 and score=90;//按条件查询where and/or

>删除一条记录

delete from stu where name=‘zhangsan’

>更新一条记录

>update stu set name=‘wangwu’ where id=1001;

>增加一列

alter table stu add column address char;

>删除一列:sqlite3不支持直接删除一列

create table stu1 as select id,name,score from stu;//创建一张表

drop table stu;//删除原有的表

alter table stu1 rename to stu;//将新表的名字改为原来的名字

3.SQlite编程

①打开数据库sqliite3_open

#include <sqlite3.h>

int sqlite3_open(const char * dbname,sqlite3 **db);

执行成功,返回SQLITE_OK(0),执行出错,返回其他错误信息(非0值);

函数的作用:打开一个数据库,若该数据库不存在,则自动创建该数据库;

参数:dbname:待打开的数据库的文件名称;

            db:数据库的句柄(相当于数据库的描述符);

②关闭数据库sqlite3_close

#include <sqlite3.h>

int sqlite3_close(sqlite3 *pDB);

执行成功,返回SQLITE_OK(0),执行出错,返回其他错误信息(非0值)

函数的作用:关闭一个打开的数据库

参数:pDB:数据库的句柄

③返回错误sqlite3_errmsg

#include <sqlite3.h>

const char * sqlite3_errmsg(sqlite3 *pDB);

成功返回错误说明的字符串指针,错误返回空指针;

函数的作用:获取最近调用的API接口返回的错误说明,并在下次调用任何sqlite API函数时自动清除

参数:pDB:数据库的句柄

④执行sql语句sqlite3_exec

#include <sqlite3.h>

int sqlite3_exec(sqlite3 *db,const char * sql,int(*callback)(void *arg,int,char *,char **),void *arg,char **errmsg);

执行成功,返回SQLITE_OK(0),执行出错,返回错误信息;

函数的作用:编译或者执行0个或多个sql语句,查询结果返回给回调函数

参数:

db:数据库的句柄;

sql:sql语句;

arg:用户传入的参数,可以为NULL,该参数指针最终会传入到回调函数callback中,供给用户在回调函数中使用;

callback:回调函数;

errmsg:返回的错误信息;

回调函数:sqlite_callback()

函数的原型:typedef int (*sqlite_callback)(void * para,int columncount,char ** columnvalue,char ** columnname);

执行成功,返回SQLITE_OK;执行错误,返回其他值

函数的作用:由用户处理sqlite3_exec的查询结果

参数:

para:从sqlite3_exec函数传染的参数指针

columncount:查询的记录的字段数(即查询到的记录的列数)

columnvalue:保存查询到的记录的数据,它为一个一维数组,每个元素都为char**型,是一个字段内容(用字符串表示,‘\0’结尾)

columnname:与columnvalue对应,表示这个字段的名称

⑤sqlite3_get_table

#include <sqlite3.h>

int sqlite3_get_table(sqlite3*pDB,const char *sql,char ***pResult,int *rowcount,int * columncount,char **errmsg);

执行成功,返回SQLITE_OK;执行出错,返回其他值;

函数的作用:执行sql语句,通过一维数组返回结果,一般该函数用于数据记录查询

参数:

pDB:数据库的句柄

sql:SQLite3语句

pResult:用于保存查询到的结果

rowcount:结果集的行数

columncount:结果集的列数

errmsg:错误的信息

相应的函数:sqlite3_free_table(char **result);

函数的作用:释放查询到的结果集占用的内存

参数:result:通过函数sqlite3_get_table()查询到的记录结果

简易的学生成绩管理系统

#include "stdio.h"
#include "stdlib.h"
#include "sqlite3.h"
#define DATABASE "stu.db"
int do_insert(sqlite3*db)//插入新一条学生数据
{
        char*errmsg;
        int id;
        char name[32]={};
        int score;
        char sql[128]={};
        printf("Input id:");
        scanf("%d",&id);
        getchar();
        printf("Input name:");
        scanf("%s",name);
        getchar();
        printf("Input score:");
        scanf("%d",&score);
        getchar();
        sprintf(sql,"insert into stu(id,name,score)values(%d,'%s',%d);",id,name,score);
        if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK){
                printf("%s\n",errmsg);
                return -1;
        }
        else{
                printf("Insert succesful\n");
        }
        return 0;
}
int do_delete(sqlite3*db)//删除一条学生数据
{
         char*errmsg;
         int id;
         char sql[128]={};
         printf("Input id:");
         scanf("%d",&id);
         getchar();
sprintf(sql,"delete from stu where id=%d;",id);
         if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK){
                 printf("%s\n",errmsg);
                 return -1;
         }
         else{
                  printf("Delete succesful\n");
         }
         return 0;

}
int do_update(sqlite3*db)//更新一个学生的成绩
{
         char*errmsg;
         int id,score;
         char sql[128]={};
         printf("Input id:");
         scanf("%d",&id);
         getchar();
         printf("Input new score:");
         scanf("%d",&score);
         getchar();
         sprintf(sql,"update stu set score=%d where id=%d;",score,id);
         if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK){
                 printf("%s\n",errmsg);
                 return -1;
         }
         else{
                  printf("Update succesful\n");
         }
         return 0;
}
int callback(void * para,int columncount,char ** columnvalue,char ** columnname)
{
        for(int i=0;i<columncount;i++)
        {
                printf("%-11s",columnvalue[i]);
        }
 printf("\n");
        return 0;
}
int do_query(sqlite3*db)//打印所有学生数据
{
        char*errmsg;
        if(sqlite3_exec(db,"select * from stu;",callback,NULL,&errmsg)!=SQLITE_OK){
                 printf("%s\n",errmsg);
                 return -1;
        }
        else{
                 printf("Update succesful\n");
        }
        return 0;
}
int main(int argc,char**argv)
{
        sqlite3 *db;
        char *errmsg;
        int option;
        if(sqlite3_open(DATABASE,&db)!=SQLITE_OK){//打开或新建数据库
                printf("%s\n",sqlite3_errmsg(db));
                exit(-1);
        }
        else{
                printf("Open DATABASE success!\n");
        }
        if(sqlite3_exec(db,"create table stu(id Integer,name char,score Integer);",NULL,NULL,&errmsg)!=SQLITE_OK){//创建一张表
                printf("%s\n",errmsg);
        }
        else{
                printf("create table successful!\n");
        }
        while(1){
                printf("*********************************************\n");
                printf("1.Insert 2.delete 3.query 4.update 5.quit\n");
                printf("Input Option:\n");
                scanf("%d",&option);
getchar();
                switch(option){
                        case 1:
                                do_insert(db);
                                break;
                        case 2:
                                do_delete(db);
                                break;
                        case 3:
                                do_query(db);
                                break;
                        case 4:
                                do_update(db);
                                break;
                        case 5:
                                sqlite3_close(db);
                                exit(1);
                        default:
                                printf("Input error!\n");
                }
        }

        return 0;
}