C语言数据库:详细的说明用学生管理系统了解数据库的操作,简单易懂。

1.数据库的操作

1.1系统命令

.help    打开帮助手册
.exit    退出数据库程序
.quit    数据库程序 或者  .q 也可以
.open    打开数据库文件
.schema  查看当前数据库文件中的建表语句(表的结构)
.tables  查看当前数据库文件中有哪些表
.headers  on/off  查询的结果是否显示表头

1.2 sql语句

不同的数据库,sql语句都是通用的(在sqlite3中会用了,其他数据库也一样)

sql语句不能以 . 开头 结尾必须要有分号 ;

sql语句不区分大小写,但是一般 关键字 我们都是用大写

1.建表语句
	CREATE TABLE 表名(字段名1 类型1,字段名2 类型2);
	//类型  
	//整数类型 INT 或者 INTEGER
	//字符串	CHAR 或者 TXT
	//例如
	CREATE TABLE student(id INT, name CHAR, score INTEGER);

2.插入数据
	INSERT INTO student VALUES(1001, '小明', 98);
		//这种方式需要从左到右给每一个字段赋值
		//注意 如果sql语句里出现 字符串,需要用单引号或者双引号引起来
	INSERT INTO  student(id, name) VALUES(1002, "张三");
		//这种方式可以选中要给哪几个字段赋值

3.查询数据
	SELECT * FROM student; //查询student表中所有记录的所有字段
							// * 表示 要查询所有字段
	SELECT id,score FROM student;//只查询 id 和 score 字段
	SELECT * FROM student WHERE score=98;//查询成绩为 98 的学员的所有字段
	SELECT * FROM student WHERE score=98 AND name="小明";
					//查询成绩为 98 且名字叫 小明 的学员的所有字段
	
	SELECT * FROM student WHERE score=98 OR score=100;
					//查询成绩为 98 或者 100 的学员的所有字段
	SELECT * FROM student ORDER BY score ASC/DESC;
					//将查询的结果根据 score 字段排序
					//ASC 升序  DESC 降序
					//默认不写是 升序
4、更新记录
	//将 id 为1001 的学员信息的成绩更新成100分
	UPDATE student SET score=100 WHERE id=1001;
	//将 赵六 的学号改为 1005 成绩改为 90
	UPDATE student SET id=1005,score=90 WHERE name='赵六';

5、删除记录
	//删除所有 score = 100 的学员
	DELETE FROM student WHERE score=100;
	//删除所有 score=100 并且 name="小明"的学员
	DELETE FROM student WHERE score=100 AND name='小明';

6、删除数据表
	DROP TABLE 表名;

注意:表的结构一般是在设计阶段就设计好的
		一般情况下不会中途修改表的结构

7、删除一列
	sqlite3 不允许直接删除一列
	1)先创建一张新表
	   CREATE TABLE temp AS SELECT id,name FROM student;
	2)删除原来的旧表
	   DROP TABLE student;
	3)对新表重命名
	   ALTER TABLE temp RENAME TO student;

8、添加一列
	//在表student中添加一个字段 sex  类型为 CHAR
	ALTER TABLE student ADD COLUMN sex CHAR;

9、主键 ----重点PRIMARY KEY
	建表时将某个字段设置成 主键 表示后续插入操作不允许主键冲突
	CREATE TABLE student(id INT PRIMARY KEY, name CHAR, score INTEGER);

1.3 sqlite3常用的API接口

1.打开数据库文件的函数
	int sqlite3_open(   const char *filename,   /* 数据库文件名 */
						sqlite3 **ppDb          /* 数据库句柄 */  );
	功能:打开一个数据库
	参数:filename   数据库名字
			ppdb      操作数据库的句柄。
	返回值:
		成功	SQLITE_OK
		失败	error_code

2.获取错误信息描述
	const char *sqlite3_errmsg(sqlite3* db);
	功能:获取最后一次的出错信息
	参数:db 数据库句柄
	返回值:指向错误信息字符串的指针
 
3.执行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 错误信息的地址
				如果使用了errmsg参数,需要调用 sqlite3_free 来释放空间
	返回值:
		成功 SQLITE_OK
		出错 errcode
-------------------------------------
sqlite3_exec 的回调函数
	int (*callback)(void* arg ,int  ncolumn , char** f_value, char** f_name)
	功能:
		得到查询结果
	参数:
		arg		 为回调函数传递参数使用的 不传参可以置NULL
		ncolumn  记录中包含的字段的数目
		f_value  包含每个字段值的指针数组
		f_name   包含每个字段名称的指针数组
	返回值:
		成功 0
		出错 非0
  
  
4.关闭数据库句柄
	int sqlite3_close(sqlite3* db);

5.sqlite3_get_table函数
int sqlite3_get_table( sqlite3 *db, const char *zSql, char ***pazResult, 
				int *pnRow, int *pnColumn, char **pzErrmsg);
	功能:
		查询数据库,它会创建一个新的内存区域来存放查询的结果信息
	参数:
		db       数据库操作句柄
		sql      数据库的sql语句
		azResult 查询的结果
		nRow     行数
		nColumn  列数
		errmsg   错误消息
	返回值:
		成功 SQLITE_OK
		出错 errcode

6.释放由sqlite3_get_table产生的结果集
	void sqlite3_free_table(char **result);

1.4 关于sqlite3_exec函数的回调函数的结果集

在此代码中这个两个主要是用来查找操作,具体怎么操作在下面的代码中都有展现。

1.4.1以表结构及记录如下图为例

 第一次调用callback

  第二次调用callback

 

 1.4.2 关于sqlite3_get_table获得的结果集

 

 1.5代码说明

#include <head.h>

#define DATABASE "tudent.db"
int flag=0;

void print_menu()
{
    printf("-------------------------------------------\n");
    printf("|  1.添加  2.修改  3.查找  4.删除   5.退出  |\n");
    printf("-------------------------------------------\n");
    printf("input your choose : ");
}

sqlite3 *proc_init()
{
    sqlite3 *my_db=NULL;
    int ret=0;
    ret=sqlite3_open(DATABASE,&my_db);
    if(SQLITE_OK!=ret){
        printf("errcode:[%d] errstr:[%s]\n",ret,sqlite3_errmsg(my_db));
        exit(-1);
    }

    printf("打开数据文件[%s]成功\n",DATABASE);

    char *errstr=NULL;
    char sqlstr[128]="create table if not exists stu(id int primary key,name char,score int)";

    if(SQLITE_OK!=(ret=sqlite3_exec(my_db,sqlstr,NULL,NULL,&errstr))){
        printf("errcode=[%d] errstr:[%s]\n",ret,errstr);
        exit(-1);
    }

    printf("建表完成\n");

    sqlite3_free(errstr);

    return my_db;
}

int add_student(sqlite3 *my_db)
{
    int input_id=0;
    char input_name[32]={0};
    int input_score=0;
    printf("请输入要添加的学员的信息(学号 姓名 成绩):");
    scanf("%d%s%d",&input_id,input_name,&input_score);

    char sqlstr[128]={0};

    sprintf(sqlstr,"insert into stu values(%d,'%s',%d)",input_id,input_name,input_score);

    int ret=0;
    if(SQLITE_OK!=(ret=sqlite3_exec(my_db,sqlstr,NULL,NULL,NULL))){
        printf("errcode:[%d] errstr:[%s]\n",ret,sqlite3_errmsg(my_db));
        exit(-1);
    }

    printf("学员信息插入成功\n");
    
    return 0;
}


int modify_stuent(sqlite3 *my_db)
{
    int modify_id=0;
    char new_name[32]={0};
    int new_score=0;
    printf("请输入你要修改的学员的id:");
    scanf("%d",&modify_id);
    printf("请输入新的名字和成绩 name score:");
    scanf("%s%d",new_name,&new_score);

    char sqlstr[128]={0};
    sprintf(sqlstr,"update stu set name='%s',score=%d where id=%d",new_name,new_score,modify_id);
    int ret=0;

    if(SQLITE_OK!=(ret=sqlite3_exec(my_db,sqlstr,NULL,NULL,NULL))){
        printf("errcode:[%d] errstr[%s]\n",ret,sqlite3_errmsg(my_db));
        exit(-1);
    }

    printf("学员信息修改成功\n");
    
    return 0;
}

int delete_student(sqlite3 *my_db)
{
    int delete_id=0;
    printf("请输入你要删除的学员id:");
    scanf("%d",&delete_id);

    char sqlstr[128]={0};
    sprintf(sqlstr,"delete from stu where id=%d",delete_id);

    int ret=0;
    if(SQLITE_OK!=(ret=sqlite3_exec(my_db,sqlstr,NULL,NULL,NULL))){
        printf("errcode:[%d] errstr:[%s]\n",ret,sqlite3_errmsg(my_db));
        exit(-1);
    }
    printf("学员被删除\n");

    return 0;
}

int callback(void *arg,int column,char **f_value,char **f_name)
{
    int i=0;
    if(0==flag){
        for(i=0;i<column;i++){
            printf("%10s",f_name[i]);
        }
        printf("\n");
        flag=1;
    }

    for(i=0;i<column;i++){
        printf("%10s",f_value[i]);
    }
    printf("\n");
    return 0;
}
int search_student_1(sqlite3 *my_db)
{
    char sqlstr[128]="select * from stu";
    int ret=0;
    if(SQLITE_OK!=(ret=sqlite3_exec(my_db,sqlstr,callback,NULL,NULL))){
        printf("errcode:[%d] errstr:[%s]\n",ret,sqlite3_errmsg(my_db));
        exit(-1);
    }
    flag=0;
    printf("查询所有成员信息成功\n");
    return 0;
}

int search_student_2(sqlite3 *my_db)
{
    char sqlstr[128]="select * from stu";

    char **result=NULL;
    int row=0;
    int column=0;
    int ret=0;
    if(SQLITE_OK!=(ret=sqlite3_get_table(my_db,sqlstr,&result,&row,&column,NULL))){
        printf("errcode:[%d] errstr:[%s]\n",ret,sqlite3_errmsg(my_db));
        exit(-1);
    }

    int i=0;
    for(i=0;i<column;i++){
        printf("%10s",result[i]);
    }

    printf("\n");

    int j=0;
    int index=i;

    for(i=0;i<row;i++){
        for(j=0;j<column;j++){
            printf("%10s",result[index++]);
        }
    }
    printf("\n");

    sqlite3_free_table(result);

    return 0;
}

int main(int argc, char const *argv[])
{
    sqlite3 *my_db=proc_init();

    int choose=0;

    while(1){
        print_menu();
        scanf("%d",&choose);
        switch(choose){
            case 1:
                add_student(my_db);
                break;
            case 2:
                modify_stuent(my_db);
                break;
            case 3:
                // search_student_1(my_db);
                search_student_2(my_db);
                break;
            case 4:
                delete_student(my_db);
            case 5:
                printf("欢迎下次光临\n");
                break;
        }

        if(choose==5){
            break;
        }
    }
    return 0;
}

  • 23
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,我可以为你提供一些关于学生信息管理系统C语言程序设计的相关信息。 首先,学生信息管理系统是一个比较典型的数据库应用程序,需要使用C语言来进行编写。以下是一个简单的学生信息管理系统的设计思路: 1. 定义学生信息结构体 首先需要定义一个学生信息的数据结构体,包括学号、姓名、性别、年龄、成绩等基本信息。 ```c typedef struct student{ char id[20]; //学号 char name[20]; //姓名 char sex[10]; //性别 int age; //年龄 float score; //成绩 }Student; ``` 2. 添加学生信息 在程序中需要定义一个数组,用来存储学生信息。当需要添加学生信息时,可以先输入学生的基本信息,然后将其存入数组中。 ```c Student stu[100]; //定义学生信息数组 int count = 0; //学生信息数量 void addStudent(){ printf("请输入学生的学号:"); scanf("%s",stu[count].id); printf("请输入学生的姓名:"); scanf("%s",stu[count].name); printf("请输入学生的性别:"); scanf("%s",stu[count].sex); printf("请输入学生的年龄:"); scanf("%d",&stu[count].age); printf("请输入学生的成绩:"); scanf("%f",&stu[count].score); count++; printf("成功添加一名学生信息!\n"); } ``` 3. 查询学生信息 可以根据学生的学号或姓名进行查询,如果查询到了该学生的信息,就输出其基本信息。 ```c void searchStudent(){ char key[20]; printf("请输入要查询的学生学号或姓名:"); scanf("%s",key); int flag = 0; for(int i=0;i<count;i++){ if(strcmp(stu[i].id,key)==0 || strcmp(stu[i].name,key)==0){ printf("学号:%s,姓名:%s,性别:%s,年龄:%d,成绩:%.2f\n",stu[i].id,stu[i].name,stu[i].sex,stu[i].age,stu[i].score); flag = 1; break; } } if(!flag){ printf("没有找到该学生信息!\n"); } } ``` 4. 修改学生信息 根据学号或姓名查询到学生信息后,可以进行修改操作。 ```c void modifyStudent(){ char key[20]; printf("请输入要修改的学生学号或姓名:"); scanf("%s",key); int flag = 0; for(int i=0;i<count;i++){ if(strcmp(stu[i].id,key)==0 || strcmp(stu[i].name,key)==0){ printf("请输入学生的学号:"); scanf("%s",stu[i].id); printf("请输入学生的姓名:"); scanf("%s",stu[i].name); printf("请输入学生的性别:"); scanf("%s",stu[i].sex); printf("请输入学生的年龄:"); scanf("%d",&stu[i].age); printf("请输入学生的成绩:"); scanf("%f",&stu[i].score); flag = 1; printf("成功修改一名学生信息!\n"); break; } } if(!flag){ printf("没有找到该学生信息!\n"); } } ``` 5. 删除学生信息 根据学号或姓名查询到学生信息后,可以进行删除操作。 ```c void deleteStudent(){ char key[20]; printf("请输入要删除的学生学号或姓名:"); scanf("%s",key); int flag = 0; for(int i=0;i<count;i++){ if(strcmp(stu[i].id,key)==0 || strcmp(stu[i].name,key)==0){ for(int j=i;j<count-1;j++){ stu[j] = stu[j+1]; } count--; flag = 1; printf("成功删除一名学生信息!\n"); break; } } if(!flag){ printf("没有找到该学生信息!\n"); } } ``` 以上就是一个简单的学生信息管理系统的设计思路。当然,这只是一个基础的程序,如果需要更加完善的功能,可以自行进行拓展和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值