sqlite3数据库实现学生管理系统

一、数据库的操作

1.系统命令

系统命令是以 . 开头的,后面不能加分号

.help 打开帮助
.quit 退出数据库
.exit 退出数据库
.open 打开数据库文件
.tables 查看数据库中有哪些表
.schema 显示建表语句(表的结构)

2.关系型数据库结构

sqlite3数据库实现学生管理系统

3.sql语句

sql语句是关系型数据库通用的,会操作sqlite了,其他的数据库,如mysql也是一样的

sql语句的关键字不区分大小写,但是一般关键字都写成大写

sql语句不能以 ” . “开头 且后面要加分号” ; “

创建一张表(打开数据库文件是不会默认创建表的,需要自己创建)
CREATE TABLE 表名(字段1 字段1的类型,… ,字段n 字段n的类型);
字段类型:
整数 :INT 或者 INTEGER
字符串:CHAR 或者 TEXT
例如: CREATE TABLE student(id INT, name TEXT, score INTEGER);

向表中添加记录
INSERT INTO 表名 VALUES(各个字段的值用逗号分隔); //这种方式需要给字段赋值,不能空
INSERT INTO 表名(字段名用逗号分隔) VALUES(各个字段的值用逗号分隔); //可以只插入几个字段
例如:INSERT INTO student VALUES(1001,”张三”,98);
INSERT INTO student(id,name) values(1002, ‘李四’);

查询表中的记录
SELECT * FROM student; // * 表示要查询所有的字段
SELECT * FROM student; // * 表示要查询所有的字段
SELECT * FROM student WHERE score=98; //在表中查询成绩为98的所有记录的所有字段
SELECT * FROM student WHERE name=”王五”; //注意sql语句中 字符串要加 单引号或双引号
SELECT * FROM student WHERE score=98 OR name=’李四’; //成绩98 或者 名字叫李四
SELECT * FROM student WHERE score=98 AND name=’王五’; //成绩98 并且 名字叫王五
SELECT * FROM student ORDER BY score ASC; //ORDER BY 表示根据那个字段排序 ASC 升序 DESC 降序

修改记录内容
UPDATE student SET score=96 WHERE id=1002; //将 student 表中 id=1003 的项全删除

删除记录
DELETE FROM student WHERE id=1003; //将 student 表中 id=1003 的项全删除

删除表
DROP TABLE 表名;

⑦添加一列 (了解)
ALTER TABLE student ADD COLUMN age INT;

⑧删除一列 (了解)
sqlite3 不允许直接删除一列
1)先根据原表的数据创建一张新表
CREATE TABLE temp1 AS SELECT id,name FROM student;
2)删除原来的旧表
DROP TABLE student;
3)对新表重命名
ALTER TABLE temp1 RENAME TO student;

数据库主键(既设置的数据将会是唯一存在的)—- 很重要
CREATE TABLE usr(name TEXT PRIMARY KEY , passwd TEXT);

4.sqlite数据库常用的API接口

使用sqlite3的函数头文件是:sqlite3.h

编译是要链接sqlite3的库: -lsqlite3

打开一个数据库
int sqlite3_open(const char filename, / Database filename (UTF-8) /
sqlite3
ppDb / OUT: SQLite db handle */ );
参数:
@filename:数据库名字
@ppDb:操作数据库的指针,句柄。
返回值: 成功返回SQLITE_OK,失败返回error_code

获取错误信息描述
const char sqlite3_errmsg(sqlite3 db);
参数:sqlite3的句柄
返回值: 错误信息(最后一次出错的信息)

执行sql语句的函数
int sqlite3_exec( sqlite3 db, const char sql, int (callback)(void,int,char,char), void * arg, char **errmsg );
功能:执行一条sql语句
参数:
@db:数据库的句柄指针
@sql:将要被执行sql语句
@callback:回调函数,只有在查询语句时,才给回调函数传参
@arg:为callback 传参的
@errmsg:错误信息的地址,如果使用了,需要用 sqlite3_free() 释放空间
返回值: 成功返回SQLITE_OK,失败返回errcode 错误码

注:sqlite3_exec的回调函数:
int (callback)(void arg ,int ncolumn ,char f_value,char f_name)
功能:得到查询结果,注意:每查到一条记录该函数就会被调用一次
参数:
@arg:为回调函数传递参数使用的
@ncolumn:记录中包含的字段的数目
@f_value:包含每个字段值的指针数组
@f_name:包含每个字段名称的指针数组
返回值: 成功返回0,失败返回非0

查询结果的函数
char p = NULL;
int sqlite3_get_table(sqlite3 db, const char *zSql, char
pazResult, int pnRow, int pnColumn, char **pzErrmsg);
功能:查询数据库,它会创建一个新的内存区域来存放查询的结果信息
参数:
@db:数据库操作句柄
@zSql:数据库的sql语句
@azResult:查询的结果
@nRow:行数–不包括字段行的行数
@nColumn:列数
@errmsg:错误消息
返回值: 成功返回0,失败返回errcode

释放sqlite3_get_table产生的结果集
sqlite3_free_table(result);

关闭sqlite数据库句柄
sqlite3_close(db);

二、使用数据库实现学生管理系统

#include <stdio.h>
#include <sqlite3.h>//sqlite3&#x6570;&#x636E;&#x5E93;&#x51FD;&#x6570;&#x7684;&#x5934;&#x6587;&#x4EF6;
#include <stdlib.h>

int flag = 0;//&#x63A7;&#x5236;&#x6253;&#x5370;&#x8868;&#x5934;&#x7684;&#x6807;&#x5FD7;&#x4F4D;  0 &#x8981;&#x6253;&#x5370;  1 &#x4E0D;&#x6253;&#x5370;

void  print_menu(){
    printf("*******************************************\n");
    printf("** 1.&#x6DFB;&#x52A0;  2.&#x4FEE;&#x6539;  3.&#x67E5;&#x8BE2;  4.&#x5220;&#x9664;  5.&#x9000;&#x51FA;  **\n");
    printf("*******************************************\n");
    printf("input your choose:");
}

//&#x7A0B;&#x5E8F;&#x521D;&#x59CB;&#x5316;&#x7684;&#x51FD;&#x6570;
sqlite3 *proc_init(){
    sqlite3 *my_db = NULL;
    char *errmsg = NULL;
    //&#x6587;&#x4EF6;&#x5B58;&#x5728;&#x76F4;&#x63A5;&#x6253;&#x5F00;&#xFF0C;&#x6587;&#x4EF6;&#x4E0D;&#x5B58;&#x5728;&#x5219;&#x65B0;&#x5EFA;&#x5E76;&#x6253;&#x5F00;
    int ret = sqlite3_open("hqyj.db", &my_db);
    if(SQLITE_OK != ret){
        printf("%s(%d) : errcode:[%d]  errmsg:[%s]\n", __FILE__, __LINE__, ret, sqlite3_errmsg(my_db));
        exit(-1);
    }

    //&#x5EFA;&#x8868;  IF NOT EXISTS &#x8868;&#x793A;
    //&#x4E0D;&#x5B58;&#x5728;&#x5C31;&#x521B;&#x5EFA;  &#x5982;&#x679C;&#x5B58;&#x5728;&#x5C31;&#x76F4;&#x63A5;&#x4F7F;&#x7528; &#x800C;&#x4E0D;&#x662F;&#x62A5;&#x9519;
    char buff[128] = {0};
    sprintf(buff, "%s", "CREATE TABLE IF NOT EXISTS student(id INT PRIMARY KEY, name TEXT, score INT)");
    if(SQLITE_OK != (ret = sqlite3_exec(my_db, buff, NULL, NULL, &errmsg))){//&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#x5982;&#x679C;&#x4F7F;&#x7528;&#x4E86;&#x9700;&#x8981;&#x81EA;&#x5DF1;&#x624B;&#x52A8;&#x91CA;&#x653E;
        printf("%s(%d) : errcode:[%d]  errmsg:[%s]\n", __FILE__, __LINE__, ret, errmsg);
        exit(-1);
    }
    //&#x91CA;&#x653E;&#x5185;&#x5B58;
    sqlite3_free(errmsg);

    return my_db;
}

//&#x6839;&#x636E;&#x5B66;&#x53F7;&#x5220;&#x9664;&#x5B66;&#x5458;
void delete_student(sqlite3 *my_db){
    int ret = 0;
    int id = 0;
    printf("&#x8BF7;&#x8F93;&#x5165;&#x8981;&#x5220;&#x9664;&#x7684;&#x5B66;&#x5458;&#x7684; id(INT):");
    scanf("%d", &id);
    //&#x7EC4;&#x88C5;sql&#x8BED;&#x53E5;&#xFF0C;&#x53EF;&#x4EE5;&#x4E0D;&#x7528;&#x52A0;&#x5206;&#x53F7;
    char buff[128] = {0};
    sprintf(buff, "DELETE FROM student WHERE id=%d", id);
    //&#x6267;&#x884C;sql&#x8BED;&#x53E5;
    if(SQLITE_OK != (ret = sqlite3_exec(my_db, buff, NULL, NULL, NULL))){//&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#x5982;&#x679C;&#x4F7F;&#x7528;&#x4E86;&#x9700;&#x8981;&#x81EA;&#x5DF1;&#x624B;&#x52A8;&#x91CA;&#x653E;
        printf("%s(%d) : errcode:[%d]  errmsg:[%s]\n", __FILE__, __LINE__, ret, sqlite3_errmsg(my_db));
        //exit(-1);
        printf("&#x5220;&#x9664;&#x5931;&#x8D25;\n");
        return;
    }
    printf("&#x5220;&#x9664;&#x6210;&#x529F;\n");
}

//&#x6839;&#x636E;&#x5B66;&#x53F7;&#x4FEE;&#x6539;&#x5B66;&#x5458;&#x4FE1;&#x606F;
void modify_student(sqlite3 *my_db){
    int ret = 0;
    int id = 0;
    char name[32] = {0};
    int score = 0;
    printf("&#x8BF7;&#x8F93;&#x5165;&#x8981;&#x4FEE;&#x6539;&#x7684;&#x5B66;&#x5458;&#x7684; id(INT) &#x4EE5;&#x53CA;&#x65B0;&#x7684;name(TEXT) score(INT):");
    scanf("%d%s%d", &id, name, &score);
    //&#x7EC4;&#x88C5;sql&#x8BED;&#x53E5;&#xFF0C;&#x53EF;&#x4EE5;&#x4E0D;&#x7528;&#x52A0;&#x5206;&#x53F7;
    char buff[128] = {0};
    sprintf(buff, "UPDATE student SET name='%s',score=%d WHERE id=%d", name, score, id);
    //&#x6267;&#x884C;sql&#x8BED;&#x53E5;
    //&#x5373;&#x4F7F;where&#x540E;&#x9762;&#x7684;&#x6761;&#x4EF6;&#x4E0D;&#x5B58;&#x5728; &#x8BED;&#x53E5;&#x4E5F;&#x80FD;&#x6267;&#x884C;&#x6210;&#x529F; &#x53EA;&#x662F;&#x76F8;&#x5F53;&#x4E8E;&#x6CA1;&#x505A;&#x4E8B;&#x513F;
    if(SQLITE_OK != (ret = sqlite3_exec(my_db, buff, NULL, NULL, NULL))){//&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#x5982;&#x679C;&#x4F7F;&#x7528;&#x4E86;&#x9700;&#x8981;&#x81EA;&#x5DF1;&#x624B;&#x52A8;&#x91CA;&#x653E;
        printf("%s(%d) : errcode:[%d]  errmsg:[%s]\n", __FILE__, __LINE__, ret, sqlite3_errmsg(my_db));
        //exit(-1);
        printf("&#x4FEE;&#x6539;&#x5931;&#x8D25;\n");
        return;
    }
    printf("&#x4FEE;&#x6539;&#x6210;&#x529F;\n");
}

//&#x63D2;&#x5165;&#x5B66;&#x5458;
void insert_student(sqlite3 *my_db){
    int ret = 0;
    int id = 0;
    char name[32] = {0};
    int score = 0;
    printf("&#x8BF7;&#x8F93;&#x5165;&#x8981;&#x63D2;&#x5165;&#x7684;&#x5B66;&#x5458;&#x7684; id(INT) name(TEXT) score(INT):");
    scanf("%d%s%d", &id, name, &score);
    //&#x7EC4;&#x88C5;sql&#x8BED;&#x53E5;&#xFF0C;&#x53EF;&#x4EE5;&#x4E0D;&#x7528;&#x52A0;&#x5206;&#x53F7;
    char buff[128] = {0};
    sprintf(buff, "INSERT INTO student VALUES(%d,'%s',%d)", id, name, score);
    //&#x6267;&#x884C;sql&#x8BED;&#x53E5;
    //&#x5373;&#x4F7F;where&#x540E;&#x9762;&#x7684;&#x6761;&#x4EF6;&#x4E0D;&#x5B58;&#x5728; &#x8BED;&#x53E5;&#x4E5F;&#x80FD;&#x6267;&#x884C;&#x6210;&#x529F; &#x53EA;&#x662F;&#x76F8;&#x5F53;&#x4E8E;&#x6CA1;&#x505A;&#x4E8B;&#x513F;
    if(SQLITE_OK != (ret = sqlite3_exec(my_db, buff, NULL, NULL, NULL))){//&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#x5982;&#x679C;&#x4F7F;&#x7528;&#x4E86;&#x9700;&#x8981;&#x81EA;&#x5DF1;&#x624B;&#x52A8;&#x91CA;&#x653E;
        printf("%s(%d) : errcode:[%d]  errmsg:[%s]\n", __FILE__, __LINE__, ret, sqlite3_errmsg(my_db));
        //exit(-1);
        printf("&#x63D2;&#x5165;&#x5931;&#x8D25;\n");
        return;
    }
    printf("&#x63D2;&#x5165;&#x6210;&#x529F;\n");
}

//callback&#x56DE;&#x8C03;&#x51FD;&#x6570;
int callback(void* arg , int ncolumn, char **f_value, char **f_name){
    //&#x6BCF;&#x67E5;&#x5230;&#x4E00;&#x6761;&#x8BB0;&#x5F55;&#x8BE5;&#x51FD;&#x6570;&#x5C31;&#x4F1A;&#x88AB;&#x8C03;&#x7528;&#x4E00;&#x6B21;
    //&#x5148;&#x6253;&#x5370;&#x8868;&#x5934;&#x4FE1;&#x606F;(&#x5B57;&#x6BB5;&#x540D;)
    int i = 0;
    if(0 == flag){
        for(i = 0; i < ncolumn; i++){
            printf("%10s", f_name[i]);
        }
        printf("\n");
        flag = 1;
    }
    //&#x518D;&#x6253;&#x5370;&#x8BB0;&#x5F55;&#x7684;&#x503C;
    for(i = 0; i < ncolumn; i++){
        printf("%10s", f_value[i]);
    }
    printf("\n");
    return 0;//&#x5FC5;&#x987B;&#x8981;&#x5199;&#x8FD4;&#x56DE;&#x503C; &#x5426;&#x5219;&#x62A5;&#x9519; query aborted
}

//&#x67E5;&#x8BE2;&#x6240;&#x6709;&#x5B66;&#x5458;&#x4FE1;&#x606F;----&#x4F7F;&#x7528;callback&#x5B9E;&#x73B0;
void select_student1(sqlite3 *my_db){
    int ret = 0;
    //&#x7EC4;&#x88C5;sql&#x8BED;&#x53E5;&#xFF0C;&#x53EF;&#x4EE5;&#x4E0D;&#x7528;&#x52A0;&#x5206;&#x53F7;
    char buff[128] = {0};
    sprintf(buff, "SELECT * FROM student");
    //&#x6267;&#x884C;sql&#x8BED;&#x53E5;
    if(SQLITE_OK != (ret = sqlite3_exec(my_db, buff, callback, NULL, NULL))){//&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#x5982;&#x679C;&#x4F7F;&#x7528;&#x4E86;&#x9700;&#x8981;&#x81EA;&#x5DF1;&#x624B;&#x52A8;&#x91CA;&#x653E;
        printf("%s(%d) : errcode:[%d]  errmsg:[%s]\n", __FILE__, __LINE__, ret, sqlite3_errmsg(my_db));
        //exit(-1);
        printf("&#x67E5;&#x8BE2;&#x5931;&#x8D25;\n");
        return;
    }
    flag = 0;//&#x91CD;&#x7F6E;&#x6807;&#x5FD7;&#x4F4D;
    printf("&#x67E5;&#x8BE2;&#x6210;&#x529F;\n");
}

//&#x67E5;&#x8BE2;&#x6240;&#x6709;&#x5B66;&#x5458;&#x4FE1;&#x606F;----&#x4F7F;&#x7528;sqlite3_get_table &#x5B9E;&#x73B0;
void select_student2(sqlite3 *my_db){
    int ret = 0;
    char **result = NULL;
    int nrows = 0;
    int ncolumns = 0;
    //&#x7EC4;&#x88C5;sql&#x8BED;&#x53E5;&#xFF0C;&#x53EF;&#x4EE5;&#x4E0D;&#x7528;&#x52A0;&#x5206;&#x53F7;
    char buff[128] = {0};
    sprintf(buff, "SELECT * FROM student");
    //&#x6267;&#x884C;sql&#x8BED;&#x53E5;
    if(SQLITE_OK != (ret = sqlite3_get_table(my_db, buff, &result, &nrows, &ncolumns, NULL))){//&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#x5982;&#x679C;&#x4F7F;&#x7528;&#x4E86;&#x9700;&#x8981;&#x81EA;&#x5DF1;&#x624B;&#x52A8;&#x91CA;&#x653E;
        printf("%s(%d) : errcode:[%d]  errmsg:[%s]\n", __FILE__, __LINE__, ret, sqlite3_errmsg(my_db));
        //exit(-1);
        printf("&#x67E5;&#x8BE2;&#x5931;&#x8D25;\n");
        return;
    }
    //&#x8F93;&#x51FA;&#x7ED3;&#x679C;
    //&#x5148;&#x8F93;&#x51FA;&#x8868;&#x5934;
    int i = 0;
    int j = 0;
    for(i = 0; i < ncolumns; i++){
        printf("%10s", result[i]);
    }
    int index = i;
    printf("\n");
    //&#x8F93;&#x51FA;&#x5404;&#x6761;&#x8BB0;&#x5F55;&#x7684;&#x5404;&#x4E2A;&#x5B57;&#x6BB5;&#x7684;&#x503C;
    for(i = 0; i < nrows; i++){//i&#x63A7;&#x5236;&#x67E5;&#x5230;&#x7684;&#x8BB0;&#x5F55;&#x6570;
        for(j = 0; j < ncolumns; j++){//j&#x63A7;&#x5236;&#x7684;&#x6BCF;&#x6761;&#x8BB0;&#x5F55;&#x7684;&#x5B57;&#x6BB5;&#x6570;
            printf("%10s", result[index++]);
        }
        printf("\n");
    }
    //&#x9632;&#x6B62;&#x5185;&#x5B58;&#x6CC4;&#x6F0F;&#xFF0C;&#x4F7F;&#x7528;&#x5B8C;&#x7ED3;&#x679C;&#x96C6;&#x540E;&#x8981;&#x624B;&#x52A8;&#x91CA;&#x653E;&#x7A7A;&#x95F4;
    sqlite3_free_table(result);
    printf("&#x67E5;&#x8BE2;&#x6210;&#x529F;\n");
}

int main(){
    sqlite3 *my_db = proc_init();
    int choose = 0;
    while(1){
        print_menu();
        scanf("%d", &choose);
        switch(choose){
            case 1:
                insert_student(my_db);
                break;
            case 2:
                modify_student(my_db);
                break;
            case 3:
                //select_student1(my_db);
                select_student2(my_db);
                break;
            case 4:
                delete_student(my_db);
                break;
            case 5:
                break;
            default:
                printf("&#x8F93;&#x5165;&#x9519;&#x8BEF;&#xFF0C;&#x8BF7;&#x91CD;&#x65B0;&#x8F93;&#x5165;(1-5)\n");
                break;
        }
        if(5 == choose){
            break;
        }
    }
    //&#x5173;&#x95ED;sqlite3 &#x53E5;&#x67C4;
    sqlite3_close(my_db);

    return 0;
}</stdlib.h></sqlite3.h></stdio.h>

注:代码中的回调函数可能不理解的点:

sqlite3数据库实现学生管理系统

sqlite3数据库实现学生管理系统

Original: https://blog.csdn.net/zhangts318/article/details/124534712
Author: zhangts318
Title: sqlite3数据库实现学生管理系统

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/815354/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球