0


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

1.数据库的操作

1.1系统命令

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

1.2 sql语句

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

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

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

  1. 1.建表语句
  2. CREATE TABLE 表名(字段名1 类型1,字段名2 类型2);
  3. //类型
  4. //整数类型 INT 或者 INTEGER
  5. //字符串 CHAR 或者 TXT
  6. //例如
  7. CREATE TABLE student(id INT, name CHAR, score INTEGER);
  8. 2.插入数据
  9. INSERT INTO student VALUES(1001, '小明', 98);
  10. //这种方式需要从左到右给每一个字段赋值
  11. //注意 如果sql语句里出现 字符串,需要用单引号或者双引号引起来
  12. INSERT INTO student(id, name) VALUES(1002, "张三");
  13. //这种方式可以选中要给哪几个字段赋值
  14. 3.查询数据
  15. SELECT * FROM student; //查询student表中所有记录的所有字段
  16. // * 表示 要查询所有字段
  17. SELECT id,score FROM student;//只查询 id 和 score 字段
  18. SELECT * FROM student WHERE score=98;//查询成绩为 98 的学员的所有字段
  19. SELECT * FROM student WHERE score=98 AND name="小明";
  20. //查询成绩为 98 且名字叫 小明 的学员的所有字段
  21. SELECT * FROM student WHERE score=98 OR score=100;
  22. //查询成绩为 98 或者 100 的学员的所有字段
  23. SELECT * FROM student ORDER BY score ASC/DESC;
  24. //将查询的结果根据 score 字段排序
  25. //ASC 升序 DESC 降序
  26. //默认不写是 升序
  27. 4、更新记录
  28. //将 id 为1001 的学员信息的成绩更新成100分
  29. UPDATE student SET score=100 WHERE id=1001;
  30. //将 赵六 的学号改为 1005 成绩改为 90
  31. UPDATE student SET id=1005,score=90 WHERE name='赵六';
  32. 5、删除记录
  33. //删除所有 score = 100 的学员
  34. DELETE FROM student WHERE score=100;
  35. //删除所有 score=100 并且 name="小明"的学员
  36. DELETE FROM student WHERE score=100 AND name='小明';
  37. 6、删除数据表
  38. DROP TABLE 表名;
  39. 注意:表的结构一般是在设计阶段就设计好的
  40. 一般情况下不会中途修改表的结构
  41. 7、删除一列
  42. sqlite3 不允许直接删除一列
  43. 1)先创建一张新表
  44. CREATE TABLE temp AS SELECT id,name FROM student;
  45. 2)删除原来的旧表
  46. DROP TABLE student;
  47. 3)对新表重命名
  48. ALTER TABLE temp RENAME TO student;
  49. 8、添加一列
  50. //在表student中添加一个字段 sex 类型为 CHAR
  51. ALTER TABLE student ADD COLUMN sex CHAR;
  52. 9、主键 ----重点PRIMARY KEY
  53. 建表时将某个字段设置成 主键 表示后续插入操作不允许主键冲突
  54. CREATE TABLE student(id INT PRIMARY KEY, name CHAR, score INTEGER);

1.3 sqlite3常用的API接口

  1. 1.打开数据库文件的函数
  2. int sqlite3_open( const char *filename, /* 数据库文件名 */
  3. sqlite3 **ppDb /* 数据库句柄 */ );
  4. 功能:打开一个数据库
  5. 参数:filename 数据库名字
  6. ppdb 操作数据库的句柄。
  7. 返回值:
  8. 成功 SQLITE_OK
  9. 失败 error_code
  10. 2.获取错误信息描述
  11. const char *sqlite3_errmsg(sqlite3* db);
  12. 功能:获取最后一次的出错信息
  13. 参数:db 数据库句柄
  14. 返回值:指向错误信息字符串的指针
  15. 3.执行sql语句的函数
  16. int sqlite3_exec(sqlite3* db, const char *sql,
  17. int (*callback)(void*,int,char**,char**),
  18. void * arg, char **errmsg);
  19. 功能:执行一条sql语句
  20. 参数: db 数据库的句柄指针
  21. sql 将要被执行sql语句
  22. callback 回调函数, 只要查询语句会用到回调函数
  23. arg callback 传参的,只有在查询语句时,才给回调函数传参
  24. errmsg 错误信息的地址
  25. 如果使用了errmsg参数,需要调用 sqlite3_free 来释放空间
  26. 返回值:
  27. 成功 SQLITE_OK
  28. 出错 errcode
  29. -------------------------------------
  30. sqlite3_exec 的回调函数
  31. int (*callback)(void* arg ,int ncolumn , char** f_value, char** f_name)
  32. 功能:
  33. 得到查询结果
  34. 参数:
  35. arg 为回调函数传递参数使用的 不传参可以置NULL
  36. ncolumn 记录中包含的字段的数目
  37. f_value 包含每个字段值的指针数组
  38. f_name 包含每个字段名称的指针数组
  39. 返回值:
  40. 成功 0
  41. 出错 0
  42. 4.关闭数据库句柄
  43. int sqlite3_close(sqlite3* db);
  44. 5.sqlite3_get_table函数
  45. int sqlite3_get_table( sqlite3 *db, const char *zSql, char ***pazResult,
  46. int *pnRow, int *pnColumn, char **pzErrmsg);
  47. 功能:
  48. 查询数据库,它会创建一个新的内存区域来存放查询的结果信息
  49. 参数:
  50. db 数据库操作句柄
  51. sql 数据库的sql语句
  52. azResult 查询的结果
  53. nRow 行数
  54. nColumn 列数
  55. errmsg 错误消息
  56. 返回值:
  57. 成功 SQLITE_OK
  58. 出错 errcode
  59. 6.释放由sqlite3_get_table产生的结果集
  60. void sqlite3_free_table(char **result);

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

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

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

第一次调用callback

第二次调用callback

1.4.2 关于sqlite3_get_table获得的结果集

1.5代码说明

  1. #include <head.h>
  2. #define DATABASE "tudent.db"
  3. int flag=0;
  4. void print_menu()
  5. {
  6. printf("-------------------------------------------\n");
  7. printf("| 1.添加 2.修改 3.查找 4.删除 5.退出 |\n");
  8. printf("-------------------------------------------\n");
  9. printf("input your choose : ");
  10. }
  11. sqlite3 *proc_init()
  12. {
  13. sqlite3 *my_db=NULL;
  14. int ret=0;
  15. ret=sqlite3_open(DATABASE,&my_db);
  16. if(SQLITE_OK!=ret){
  17. printf("errcode:[%d] errstr:[%s]\n",ret,sqlite3_errmsg(my_db));
  18. exit(-1);
  19. }
  20. printf("打开数据文件[%s]成功\n",DATABASE);
  21. char *errstr=NULL;
  22. char sqlstr[128]="create table if not exists stu(id int primary key,name char,score int)";
  23. if(SQLITE_OK!=(ret=sqlite3_exec(my_db,sqlstr,NULL,NULL,&errstr))){
  24. printf("errcode=[%d] errstr:[%s]\n",ret,errstr);
  25. exit(-1);
  26. }
  27. printf("建表完成\n");
  28. sqlite3_free(errstr);
  29. return my_db;
  30. }
  31. int add_student(sqlite3 *my_db)
  32. {
  33. int input_id=0;
  34. char input_name[32]={0};
  35. int input_score=0;
  36. printf("请输入要添加的学员的信息(学号 姓名 成绩):");
  37. scanf("%d%s%d",&input_id,input_name,&input_score);
  38. char sqlstr[128]={0};
  39. sprintf(sqlstr,"insert into stu values(%d,'%s',%d)",input_id,input_name,input_score);
  40. int ret=0;
  41. if(SQLITE_OK!=(ret=sqlite3_exec(my_db,sqlstr,NULL,NULL,NULL))){
  42. printf("errcode:[%d] errstr:[%s]\n",ret,sqlite3_errmsg(my_db));
  43. exit(-1);
  44. }
  45. printf("学员信息插入成功\n");
  46. return 0;
  47. }
  48. int modify_stuent(sqlite3 *my_db)
  49. {
  50. int modify_id=0;
  51. char new_name[32]={0};
  52. int new_score=0;
  53. printf("请输入你要修改的学员的id:");
  54. scanf("%d",&modify_id);
  55. printf("请输入新的名字和成绩 name score:");
  56. scanf("%s%d",new_name,&new_score);
  57. char sqlstr[128]={0};
  58. sprintf(sqlstr,"update stu set name='%s',score=%d where id=%d",new_name,new_score,modify_id);
  59. int ret=0;
  60. if(SQLITE_OK!=(ret=sqlite3_exec(my_db,sqlstr,NULL,NULL,NULL))){
  61. printf("errcode:[%d] errstr[%s]\n",ret,sqlite3_errmsg(my_db));
  62. exit(-1);
  63. }
  64. printf("学员信息修改成功\n");
  65. return 0;
  66. }
  67. int delete_student(sqlite3 *my_db)
  68. {
  69. int delete_id=0;
  70. printf("请输入你要删除的学员id:");
  71. scanf("%d",&delete_id);
  72. char sqlstr[128]={0};
  73. sprintf(sqlstr,"delete from stu where id=%d",delete_id);
  74. int ret=0;
  75. if(SQLITE_OK!=(ret=sqlite3_exec(my_db,sqlstr,NULL,NULL,NULL))){
  76. printf("errcode:[%d] errstr:[%s]\n",ret,sqlite3_errmsg(my_db));
  77. exit(-1);
  78. }
  79. printf("学员被删除\n");
  80. return 0;
  81. }
  82. int callback(void *arg,int column,char **f_value,char **f_name)
  83. {
  84. int i=0;
  85. if(0==flag){
  86. for(i=0;i<column;i++){
  87. printf("%10s",f_name[i]);
  88. }
  89. printf("\n");
  90. flag=1;
  91. }
  92. for(i=0;i<column;i++){
  93. printf("%10s",f_value[i]);
  94. }
  95. printf("\n");
  96. return 0;
  97. }
  98. int search_student_1(sqlite3 *my_db)
  99. {
  100. char sqlstr[128]="select * from stu";
  101. int ret=0;
  102. if(SQLITE_OK!=(ret=sqlite3_exec(my_db,sqlstr,callback,NULL,NULL))){
  103. printf("errcode:[%d] errstr:[%s]\n",ret,sqlite3_errmsg(my_db));
  104. exit(-1);
  105. }
  106. flag=0;
  107. printf("查询所有成员信息成功\n");
  108. return 0;
  109. }
  110. int search_student_2(sqlite3 *my_db)
  111. {
  112. char sqlstr[128]="select * from stu";
  113. char **result=NULL;
  114. int row=0;
  115. int column=0;
  116. int ret=0;
  117. if(SQLITE_OK!=(ret=sqlite3_get_table(my_db,sqlstr,&result,&row,&column,NULL))){
  118. printf("errcode:[%d] errstr:[%s]\n",ret,sqlite3_errmsg(my_db));
  119. exit(-1);
  120. }
  121. int i=0;
  122. for(i=0;i<column;i++){
  123. printf("%10s",result[i]);
  124. }
  125. printf("\n");
  126. int j=0;
  127. int index=i;
  128. for(i=0;i<row;i++){
  129. for(j=0;j<column;j++){
  130. printf("%10s",result[index++]);
  131. }
  132. }
  133. printf("\n");
  134. sqlite3_free_table(result);
  135. return 0;
  136. }
  137. int main(int argc, char const *argv[])
  138. {
  139. sqlite3 *my_db=proc_init();
  140. int choose=0;
  141. while(1){
  142. print_menu();
  143. scanf("%d",&choose);
  144. switch(choose){
  145. case 1:
  146. add_student(my_db);
  147. break;
  148. case 2:
  149. modify_stuent(my_db);
  150. break;
  151. case 3:
  152. // search_student_1(my_db);
  153. search_student_2(my_db);
  154. break;
  155. case 4:
  156. delete_student(my_db);
  157. case 5:
  158. printf("欢迎下次光临\n");
  159. break;
  160. }
  161. if(choose==5){
  162. break;
  163. }
  164. }
  165. return 0;
  166. }
标签: 数据库 sql mysql

本文转载自: https://blog.csdn.net/a2998658795/article/details/125879024
版权归原作者 lhb2998658795 所有, 如有侵权,请联系我们删除。

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

还没有评论