【无标题】

在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>


//定义添加学生信息函数
int do_add(sqlite3 *ppDb)
{
    int add_id;         //要添加的ID号
    char add_name[20];  //要添加的姓名
    double add_score;   //要添加的成绩

    printf("请输入要添加学生的学号:");
    scanf("%d", &add_id);
    printf("请输入要添加学生的姓名:");
    scanf("%s", add_name);
    printf("请输入要添加学生的成绩:");
    scanf("%lf", &add_score);
    getchar();

    //准备SQL语句
    char sql[128] = "";
    sprintf(sql, "insert into stuinfo values(%d, \"%s\", %.2lf);",
            add_id, add_name, add_score);
    
    printf("sql = %s\n", sql);    

    //执行SQL语句
    char *errmsg = NULL;
    if(sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK)
    {
        printf("添加失败:%s\n", errmsg);
        sqlite3_free(errmsg);
        errmsg = NULL;
        return -1;
    }

    if(sqlite3_changes(ppDb) != 0)
    {
        printf("添加成功\n");
    }
    return 0;
}

//定义删除学生信息函数
int do_delete(sqlite3 *ppDb)
{
    int del_id;  //要删除的学生ID

    printf("请输入要删除的学生学号:");
    scanf("%d", &del_id);
    getchar();

    //准备SQL语句
    char sql[128] = "";
    sprintf(sql, "delete from stuinfo where id = %d;", del_id);
    
    printf("sql = %s\n", sql);    


    //执行SQL语句
    char *errmsg = NULL;
    if(sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK)
    {
        printf("删除失败:%s\n", errmsg);
        sqlite3_free(errmsg);
        errmsg = NULL;
        return -1;
    }

    if(sqlite3_changes(ppDb) != 0)
    {
        printf("删除成功\n");
    }
    else
    {
        printf("未找到该学号的学生信息,删除失败\n");
    }
    return 0;
}

//定义修改学生信息函数
int do_update(sqlite3 *ppDb)
{
    int upd_id;         //要修改的学生ID
    char upd_name[20];  //新的姓名
    double upd_score;   //新的成绩
    int choice;         //选择修改的内容

    printf("请输入要修改的学生学号:");
    scanf("%d", &upd_id);
    getchar();

    //显示修改选项
    printf("请选择要修改的内容:\n");
    printf("1、修改姓名\n");
    printf("2、修改成绩\n");
    printf("3、修改姓名和成绩\n");
    printf("请选择:");
    scanf("%d", &choice);
    getchar();

    char sql[128] = "";

    switch(choice)
    {
        case 1:
            printf("请输入新的姓名:");
            scanf("%s", upd_name);
            getchar();
            sprintf(sql, "update stuinfo set name = \"%s\" where id = %d;",
                    upd_name, upd_id);
            break;
        case 2:
            printf("请输入新的成绩:");
            scanf("%lf", &upd_score);
            getchar();
            sprintf(sql, "update stuinfo set score = %.2lf where id = %d;",
                    upd_score, upd_id);
            break;
        case 3:
            printf("请输入新的姓名:");
            scanf("%s", upd_name);
            printf("请输入新的成绩:");
            scanf("%lf", &upd_score);
            getchar();
            sprintf(sql, "update stuinfo set name = \"%s\", score = %.2lf where id = %d;",
                    upd_name, upd_score, upd_id);
            break;
        default:
            printf("输入有误,取消修改\n");
            return -1;
    }
    

    printf("sql = %s\n", sql);    


    //执行SQL语句
    char *errmsg = NULL;
    if(sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK)
    {
        printf("修改失败:%s\n", errmsg);
        sqlite3_free(errmsg);
        errmsg = NULL;
        return -1;
    }

    if(sqlite3_changes(ppDb) != 0)
    {
        printf("修改成功\n");
    }
    else
    {
        printf("未找到该学号的学生信息,修改失败\n");
    }
    return 0;
}

//自定义查询函数的回调函数
int callback(void *arg, int cols, char **msgtext, char **msgheader)
{
    if( *(int *)arg == 0 )
    {
        //先输出表头
        for(int i = 0; i < cols; i++)
        {
            printf("%s\t", msgheader[i]);
        }
        printf("\n");
        *(int *)arg = 1;
    }

    //输出内容
    for(int i = 0; i < cols; i++)
    {
        printf("%s\t", msgtext[i]);
    }
    printf("\n");

    return 0;
}

//定义查找函数
int do_search(sqlite3 *ppDb)
{
    int search_choice;
    
    printf("请选择查询方式:\n");
    printf("1、查询所有学生信息\n");
    printf("2、按学号查询\n");
    printf("请选择:");
    scanf("%d", &search_choice);
    getchar();

    char sql[128] = "";
    
    switch(search_choice)
    {
        case 1:
            strcpy(sql, "select * from stuinfo;");
            break;
        case 2:
        {
            int search_id;
            printf("请输入要查询的学生学号:");
            scanf("%d", &search_id);
            getchar();
            sprintf(sql, "select * from stuinfo where id = %d;", search_id);
            break;
        }
        default:
            printf("输入有误,查询取消\n");
            return -1;
    }
    
    //执行SQL语句
    char *errmsg = NULL;
    int flag = 0;
    if(sqlite3_exec(ppDb, sql, callback, &flag, &errmsg) != SQLITE_OK)
    {
        printf("查询失败:%s\n", errmsg);
        sqlite3_free(errmsg);
        errmsg = NULL;
        return -1;
    }

    if(flag == 0)
    {
        printf("未找到任何学生信息\n");
    }
    else
    {
        printf("查询成功\n");
    }
    return 0;
}

/******************************主程序****************************/
int main(int argc, const char *argv[])
{
    //1、打开数据库并返回一个操作该数据库的句柄
    sqlite3 * ppDb = NULL;
    if(sqlite3_open("./my.db", &ppDb) != SQLITE_OK)
    {
        printf("my.db open error errcode=%d,errmsg=%s\n",
             sqlite3_errcode(ppDb), sqlite3_errmsg(ppDb));
        return -1;
    }

    //程序执行至此,后期可以使用ppDb指针,进行数据库操作了
    //2、创建一个学生信息表
    //准备SQL语句
    char *sql = "create table if not exists stuinfo(id int primary key,\
                                                     name text not NULL,\
                                                     score double);";
    
    //定义指针接收执行SQL语句后的错误信息
    char *errmsg = NULL;

    //执行SQL语句
    if(sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK)
    {
        printf("创建数据表失败:%s\n", errmsg);
        sqlite3_free(errmsg);
        errmsg = NULL;
        return -1;
    }
    printf("学生信息表创建成功\n");


    //循环做个菜单用于操作数据库
    int menu = -1;
    while(1)
    {
        system("clear");           //执行系统终端指令
        printf("\t\t==============XXX学生管理系统=============\n");
        printf("\t\t==============1、增=======================\n");
        printf("\t\t==============2、删=======================\n");
        printf("\t\t==============3、改=======================\n");
        printf("\t\t==============4、查=======================\n");
        printf("\t\t==============0、退出=======================\n");

        printf("请输入功能:");
        scanf("%d", &menu);
        getchar();


        //多分支选择
        switch(menu)
        {
        case 1:
            {
                do_add(ppDb);
            }
            break;

        case 2:
            {
                do_delete(ppDb);
            }
            break;

        case 3:
            {
                do_update(ppDb);
            }
            break;
        case 4:
            {
                do_search(ppDb);
            }
            break;
        case 0: 
            printf("退出系统\n");
            sqlite3_close(ppDb);
            exit(EXIT_SUCCESS);
        default:
            printf("输入有错,请重新输入\n");
        }

        printf("按任意键后,按回车清屏\n");
        while(getchar() != '\n');
    }

    //关闭数据库(理论上不会执行到这里,因为上面有exit)
    sqlite3_close(ppDb);
    
    return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值