• MySQL学生成绩管理系统based on C++ and Clion


    mysql_free_result()函数的作用是释放结果集的内存,是同步的,也就是要中断一下

    该实验使用了MySQL链接数据库的基本使用方法,具体使用了

    MYSQL_RES 数据库的mysql_store_result()函数的返回值是一个结果集,该函数的作用是检索比并存储整个结果集
    MYSQL_ROW 数据库的mysql_fetch_row()函数的返回值是一个集行,搭配上一个mysql_res使用的,一个一个读他,函数的作用是获取下一个结果集行
    

    mysql_query()函数是执行语句的意思,也就是发给数据库让他执行这条语句,函数传递语句的使用如果是std::string 类型的话,需要调用.c_str()函数进行转化成字符才能进行传递

    1. std::ifstream infile("../src/student2.txt",std::ios::in);
    2. infile>>temp[j];
    1. std::ofstream outfile("../src/student2.txt",std::ios::out);
    2. outfile<<"学号\t"<<"名字\t"<<"得分\n"<

    该方法分别对应了流对于文件的读入和写入操作的执行,使用完毕之后要执行close()操作

    本实验我认为最重要的是对于mysql的链接建立问题

    1. MYSQL mysql;
    2. const char db_Username[]="root";
    3. const char db_Password[]="123456";
    4. const char db_Host[]="localhost";
    5. const char db_Name[]="sp";
    6. unsigned long db_Port=3306;
    7. mysql_init(&mysql);
    8. mysql_options(&mysql,MYSQL_SET_CHARSET_NAME,"gbk");
    9. if(mysql_real_connect(&mysql,db_Host,db_Username,db_Password,db_Name,db_Port,NULL,0)==NULL){
    10. std::cout<<"connect error!!!"<
    11. return false;
    12. }
    13. std::cout<<"connect success!!!"<
    1. build
    2. docs
    3. include
      1. Main.h
      2. Student.h
    4. src
      1. main.cpp
      2. Methods.cpp
      3. student.cpp
      4. student2.txt
    5. CMakeLists.txt

    Main.h

    1. #ifndef NEW_PROJECTS_MAIN_H
    2. #define NEW_PROJECTS_MAIN_H
    3. #include
    4. #include
    5. #include
    6. void show_mean();//显示菜单
    7. bool connect_mysql(MYSQL& mysql);//链接数据库
    8. void query(MYSQL& mysql);//查询学生数据
    9. void modify(MYSQL& mysql);//修改学生数据
    10. void insert(MYSQL& mysql);//添加学生数据
    11. void Delete(MYSQL& mysql);//删除学生数据
    12. void filein(MYSQL& mysql);//导入文件数据
    13. int getline();//获取文件行数
    14. void fileout(MYSQL& mysql);//将数据库中的文件导出到另外一个文件中
    15. void createTable(MYSQL& mysql);//创建表格
    16. #endif //NEW_PROJECTS_MAIN_H

    Student.h

    1. #ifndef NEW_PROJECTS_STUDENT_H
    2. #define NEW_PROJECTS_STUDENT_H
    3. #include"main.h"
    4. class Student{
    5. private:
    6. int Id;
    7. std::string name;
    8. int score;
    9. public:
    10. int getId();
    11. std::string getName();
    12. int getScore();
    13. void setId(int& Id);
    14. void setName(std::string& name);
    15. void setScore(int& score);
    16. };
    17. #endif //NEW_PROJECTS_STUDENT_H

    main.cpp

    1. #include "Main.h"
    2. int main() {
    3. MYSQL mysql;
    4. mysql_init(&mysql);
    5. mysql_options(&mysql,MYSQL_SET_CHARSET_NAME,"gbk");
    6. system("chcp 65001");
    7. if(connect_mysql(mysql)==false){
    8. return 0;
    9. }
    10. else{
    11. int choices=1;
    12. while(choices!=0){
    13. show_mean();
    14. std::cin>>choices;
    15. switch (choices) {
    16. case 1:
    17. filein(mysql);
    18. break;
    19. case 2:
    20. query(mysql);
    21. break;
    22. case 3:
    23. modify(mysql);
    24. break;
    25. case 4:
    26. insert(mysql);
    27. break;
    28. case 5:
    29. Delete(mysql);
    30. break;
    31. case 0:
    32. fileout(mysql);
    33. break;
    34. default:
    35. std::cout<<"Input error,please again!!!"<
    36. break;
    37. }
    38. }
    39. std::cout<<"success"<
    40. system("pause");
    41. system("cls");
    42. }
    43. }

    Methods.cpp

    1. #include"Main.h"
    2. #include"Student.h"
    3. void show_mean() // 展示功能菜单并让用户选择功能
    4. {
    5. std::cout << std::endl << "=========================================欢迎使用学生管理系统========================================" << std::endl << std::endl;;
    6. std::cout << "请选择您要进行的操作" << std::endl;
    7. std::cout << "\t 1. 读取学生数据并显示" << std::endl;
    8. std::cout << "\t 2. 查询学生数据" << std::endl;
    9. std::cout << "\t 3. 修改学生数据" << std::endl;
    10. std::cout << "\t 4. 添加学生数据" << std::endl;
    11. std::cout << "\t 5. 删除学生数据" << std::endl;
    12. std::cout << "\t 0. 退出管理系统" << std::endl;
    13. }
    14. void create_table(MYSQL& mysql){
    15. char Quest[]= "CREATE TABLE IF NOT EXISTS `Student1`(\
    16. `Id` int AUTO_INCREMENT,\
    17. `name` varchar(20),\
    18. `score` double,\
    19. PRIMARY KEY (`Id`)\
    20. )ENGINE=InnoDB DEFAULT CHARSET=utf8;";
    21. int re=mysql_query(&mysql,Quest);
    22. if(re==0)
    23. std::cout<<"table already"<
    24. }
    25. bool connect_mysql(MYSQL& mysql){
    26. const char db_Username[]="root";
    27. const char db_Password[]="123456";
    28. const char db_Host[]="localhost";
    29. const char db_Name[]="sp";
    30. unsigned long db_Port=3306;
    31. mysql_init(&mysql);
    32. mysql_options(&mysql,MYSQL_SET_CHARSET_NAME,"gbk");
    33. if(mysql_real_connect(&mysql,db_Host,db_Username,db_Password,db_Name,db_Port,NULL,0)==NULL){
    34. std::cout<<"connect error!!!"<
    35. return false;
    36. }
    37. std::cout<<"connect success!!!"<
    38. create_table(mysql);
    39. return true;
    40. }
    41. int getline(){
    42. int len=0;
    43. std::ifstream infile("../src/student2.txt",std::ios::in);
    44. char c;
    45. // if (!infile.is_open()) {
    46. // std::cerr << "Error: Unable to open file. ";
    47. // std::cerr << "Error code: " << errno << std::endl;
    48. // return -1; // 或者其他适当的错误码
    49. // }
    50. while(infile.get(c)){
    51. // if(c=='\n')len++;
    52. len++;
    53. std::cout<
    54. }
    55. infile.close();
    56. std::cout<<"data_len is "<-1<
    57. return len;
    58. }
    59. void filein(MYSQL& mysql){
    60. int n=getline();
    61. std::cout<<"already student data:"<
    62. mysql_options(&mysql,MYSQL_SET_CHARSET_NAME,"gbk");
    63. std::ifstream infile("../src/student2.txt",std::ios::in);
    64. const int N=300;
    65. const int N2=100;
    66. std::string temp[N];
    67. Student* student=new Student[N2];
    68. int x=0;
    69. int tempId;
    70. int tempScore;
    71. if(!infile.is_open()){
    72. std::cout<<"file open errr!!!"<
    73. exit(0);
    74. }
    75. else{
    76. char line[256]={0};
    77. int i=0;
    78. while(!infile.eof()&&i
    79. for(int j=i;j3;j++){
    80. infile>>temp[j];
    81. std::cout<<"\t\t"<"\t";
    82. }
    83. std::cout<
    84. tempId=atoi(temp[i].c_str());
    85. tempScore=atoi(temp[i+2].c_str());
    86. student[x].setId(tempId);
    87. student[x].setName(temp[i+1]);
    88. student[x].setScore(tempScore);
    89. x++;
    90. i=i+3;
    91. }
    92. infile.close();
    93. }
    94. std::cout<<"insert into student1 table"<
    95. for(int i=1;i
    96. std::string sql = "insert into Student1 values (" + std::to_string(student[i].getId()) + "," + "'" + student[i].getName() + "'" + "," + std::to_string(student[i].getScore()) + ")";
    97. std::cout<
    98. mysql_query(&mysql,sql.c_str());
    99. }
    100. delete[] student;
    101. }
    102. void fileout(MYSQL& mysql){
    103. MYSQL_RES* res;
    104. MYSQL_ROW row;
    105. std::ofstream outfile("../src/student2.txt",std::ios::out);
    106. mysql_query(&mysql,"select * from student1 order by Id");
    107. res= mysql_store_result(&mysql);
    108. std::cout<<"data:"<
    109. std::cout<<"学号\t"<<"名字\t"<<"得分\n"<
    110. outfile<<"学号\t"<<"名字\t"<<"得分\n"<
    111. while(row= mysql_fetch_row(res)){
    112. std::cout<<"\t"<0]<<"\t\t"<1]<<"\t\t"<2]<
    113. outfile << row[0] << "\t" << row[1] << "\t" << row[2] << std::endl;
    114. }
    115. std::cout << "他们将被保存到../src/student2.txt中" << std::endl;
    116. outfile.close();
    117. mysql_free_result(res);
    118. }
    119. void query(MYSQL& mysql) // 查询学生数据
    120. {
    121. MYSQL_RES* res; // 创建一个结果集
    122. MYSQL_ROW row; // 二维数组存放记录
    123. std::cout << "您选择了查询学生信息" << std::endl;
    124. std::cout << "请输入您要查询的选项" << std::endl;
    125. std::cout << "\t 1. 查询全部学生" << std::endl;
    126. std::cout << "\t 2. 按学号查询" << std::endl;
    127. std::cout << "\t 3. 按照名字进行查询" << std::endl;
    128. std::cout << "\t 4. 按照分数进行查询" << std::endl;
    129. std::cout << "\t 5.自定义SQL命令进行查询" << std::endl;
    130. int choice;
    131. std::string sql;
    132. std::cin >> choice;
    133. switch (choice) {
    134. case 1:
    135. {
    136. std::cout << "全体学生信息如下:" << std::endl;
    137. sql = "select * from student1 order by Id";
    138. std::cout << "查询的SQL语句如下:" << std::endl << sql << std::endl; // 检查语句
    139. mysql_query(&mysql, sql.c_str());
    140. break;
    141. }
    142. case 2:
    143. {
    144. std::cout << "请输入要查询的学生学号" << std::endl;
    145. int Id;
    146. std::cin >> Id;
    147. sql = "select * from student1 where Id = " + std::to_string(Id) + " order by Id";
    148. std::cout << "查询的SQL语句如下:" << std::endl << sql << std::endl; // 检查语句
    149. mysql_query(&mysql, sql.c_str());
    150. break;
    151. }
    152. case 3:
    153. {
    154. std::cout << "请输入要查询的学生姓名" << std::endl;
    155. std::string name;
    156. std::cin >> name;
    157. sql = "select * from student1 where name = '" + name + "' order by Id";
    158. std::cout << "查询的SQL语句如下:" << std::endl << sql << std::endl; // 检查语句
    159. mysql_query(&mysql, sql.c_str());
    160. break;
    161. }
    162. case 4:
    163. {
    164. std::cout << "请输入要查询的学生分数" << std::endl;
    165. int score;
    166. std::cin >> score;
    167. sql = "select * from student1 where score = " + std::to_string(score) + " order by Id";
    168. std::cout << "查询的SQL语句如下:" << std::endl << sql << std::endl; // 检查语句
    169. mysql_query(&mysql, sql.c_str());
    170. break;
    171. }
    172. case 5:
    173. {
    174. std::cout << "请输入SQL命令语句" << std::endl;
    175. std::cin.ignore(1024, '\n');
    176. getline(std::cin, sql);
    177. std::cout << "查询的SQL语句如下:" << std::endl<< sql << std::endl; // 检查语句
    178. mysql_query(&mysql, sql.c_str());
    179. break;
    180. }
    181. default:
    182. std::cout << "输入有误请重试" << std::endl;
    183. }
    184. std::cout << "\t\t查询结果如下" << std::endl;
    185. res = mysql_store_result(&mysql); // 将查询得到的数据存入结果集
    186. if (res == NULL)
    187. std::cout << "所有学生均与你查询的数据不匹配" << std::endl;
    188. else {
    189. std::cout << "\t学号\t" << "\t姓名\t" << "\t得分\t" << std::endl;
    190. while (row = mysql_fetch_row(res))
    191. {
    192. std::cout << "\t" << row[0] << "\t\t" << row[1] << "\t\t" << row[2] << std::endl;
    193. }
    194. }
    195. mysql_free_result(res);
    196. }
    197. void modify(MYSQL& mysql) // 修改学生数据
    198. {
    199. int choice;
    200. int Id;
    201. std::string name;
    202. int score;
    203. std::string sql1;
    204. std::string sql2;
    205. std::string sql;
    206. MYSQL_RES* res;
    207. MYSQL_ROW row;
    208. std::cout << "您选择了修改学生信息" << std::endl;
    209. std::cout << "请输入您要修改的学生的信息及数据" << std::endl;
    210. std::cout << "\t 1. 按学号修改" << std::endl;
    211. std::cout << "\t 2. 按名字修改" << std::endl;
    212. std::cin >> choice;
    213. switch (choice)
    214. {
    215. case 1:
    216. {
    217. std::cout << "请输入要修改的学生学号" << std::endl;
    218. std::cin >> Id;
    219. sql = "select * from student1 where Id = " + std::to_string(Id) + " order by Id";
    220. // sql = "select * from student1 where Id =" + to_string(Id);
    221. mysql_query(&mysql, sql.c_str());
    222. res = mysql_store_result(&mysql);
    223. row = mysql_fetch_row(res);
    224. if (row == NULL)
    225. {
    226. std::cout << "不存在该学号的学生" << std::endl;
    227. break;
    228. }
    229. else
    230. std::cout << "请输入修改之后的学生姓名" << std::endl;
    231. std::cin >> name;
    232. std::cout << "请输入修改之后的学生分数" << std::endl;
    233. std::cin >> score;
    234. sql1 = "update Student1 set name= '" + name + "' where Id=" + std::to_string(Id);
    235. sql2 = "update Student1 set score= " + std::to_string(score) + " where Id=" + std::to_string(Id);
    236. std::cout << "修改的的SQL语句如下:" << std::endl << sql1 << std::endl << sql2 << std::endl; // 检查语句
    237. mysql_query(&mysql, sql1.c_str());
    238. mysql_query(&mysql, sql2.c_str());
    239. break;
    240. }
    241. case 2:
    242. {
    243. std::cout << "请输入要修改的学生姓名" << std::endl;
    244. std::cin >> name;
    245. sql1 = "select * from Student1 where name ='" + name + "'";
    246. mysql_query(&mysql, sql1.c_str());
    247. res = mysql_store_result(&mysql);
    248. row = mysql_fetch_row(res);
    249. if (row == NULL)
    250. {
    251. std::cout << "不存在该姓名的学生" << std::endl;
    252. break;
    253. }
    254. else
    255. std::cout << "请输入修改之后的学生学号" << std::endl;
    256. std::cin >> Id;
    257. std::cout << "请输入修改之后的学生分数" << std::endl;
    258. std::cin >> score;
    259. sql1 = "update Student1 set Id= " + std::to_string(Id) + " where name='" + name + "'";
    260. sql2 = "update Student1 set score= " + std::to_string(score) + " where name='" + name + "'";
    261. std::cout << "修改的的SQL语句如下:" << std::endl << sql1 << std::endl << sql2 << std::endl; // 检查语句
    262. mysql_query(&mysql, sql1.c_str());
    263. mysql_query(&mysql, sql2.c_str());
    264. break;
    265. }
    266. default:
    267. std::cout << "输入有误请重试" << std::endl;
    268. }
    269. //mysql_free_result(res);
    270. }
    271. void insert(MYSQL& mysql)//添加学生信息
    272. {
    273. int Id;
    274. std::string name;
    275. int score;
    276. MYSQL_RES* res; // 创建一个结果集
    277. MYSQL_ROW row; // 二维数组存放记录
    278. std::string sql1;
    279. std::string sql2;
    280. std::cout << "您选择了添加学生信息" << std::endl;
    281. std::cout << "请输入学生学号" << std::endl;
    282. std::cin >> Id;
    283. sql1 = "select * from student1 where Id = " + std::to_string(Id) + " order by Id";
    284. mysql_query(&mysql, sql1.c_str());
    285. res = mysql_store_result(&mysql);
    286. row = mysql_fetch_row(res);
    287. if (row != NULL)
    288. std::cout << "已存在该学号的学生,系统不允许学号相同,请重新添加或选择修改该学生信息" << std::endl;
    289. else {
    290. std::cout << "请输入学生名字" << std::endl;
    291. std::cin >> name;
    292. std::cout << "请输入学生得分" << std::endl;
    293. std::cin >> score;
    294. sql2 = "insert into Student1 values (" + std::to_string(Id) + "," + "'" + name + "'" + "," + std::to_string(score) + ")";
    295. std::cout << "插入的SQL语句如下:" << std::endl << sql2 << std::endl; // 检查语句
    296. mysql_query(&mysql, sql2.c_str());
    297. // 使用sql命令对数据库进行数据添加
    298. }
    299. mysql_free_result(res);
    300. }
    301. void Delete(MYSQL& mysql) // 删除学生数据
    302. {
    303. int choice = 1;
    304. int Id;
    305. std::string name, sql1, sql2;
    306. int score;
    307. MYSQL_RES* res;
    308. MYSQL_ROW row;
    309. std::cout << "您选择了删除学生信息" << std::endl;
    310. //std::cout << "请输入您要删除的学生信息" << std::endl;
    311. std::cout << "\t 1. 按学号删除" << std::endl;
    312. std::cout << "\t 2. 按名字删除" << std::endl;
    313. std::cout << "\t 3. 按照分数删除" << std::endl;
    314. std::cin >> choice;
    315. switch (choice) {
    316. case 1:
    317. {
    318. std::cout << "请输入该生学号" << std::endl;
    319. std::cin >> Id;
    320. sql1 = "select * from Student1 where Id =" + std::to_string(Id);
    321. mysql_query(&mysql, sql1.c_str());
    322. res = mysql_store_result(&mysql);
    323. row = mysql_fetch_row(res);
    324. if (row == NULL)
    325. {
    326. std::cout << "不存在该学号的学生" << std::endl;
    327. break;
    328. }
    329. else
    330. sql2 = "delete from Student1 where Id= " + std::to_string(Id);
    331. std::cout << "删除的SQL语句如下:" << std::endl << sql2 << std::endl; // 检查语句
    332. mysql_query(&mysql, sql2.c_str());
    333. break;
    334. }
    335. case 2:
    336. {
    337. std::cout << "请输入该生姓名" << std::endl;
    338. std::cin >> name;
    339. sql1 = "select * from Student1 where name ='" + name + "'";
    340. mysql_query(&mysql, sql1.c_str());
    341. res = mysql_store_result(&mysql);
    342. row = mysql_fetch_row(res);
    343. if (row == NULL)
    344. {
    345. std::cout << "不存在该姓名的学生" << std::endl;
    346. break;
    347. }
    348. else
    349. sql2 = "delete from Student1 where name= '" + name + "'";
    350. std::cout << "删除的SQL语句如下:" << std::endl << sql2 << std::endl; // 检查语句
    351. mysql_query(&mysql, sql2.c_str());
    352. break;
    353. }
    354. case 3:
    355. {
    356. std::cout << "您确定要使用分数来删除信息吗,该操作可能会影响多名学生" << std::endl;
    357. std::cout << "1.确定\t 2.取消" << std::endl;
    358. int c = 0;
    359. std::cin >> c;
    360. if (c != 1)
    361. {
    362. std::cout << "您选择了取消操作" << std::endl; break;
    363. }
    364. else
    365. std::cout << "您依旧选择了使用分数删除信息!" << std::endl;
    366. std::cout << "请选择要删除的分数" << std::endl;
    367. std::cin >> score;
    368. sql1 = "select * from Student1 where score =" + std::to_string(score);
    369. mysql_query(&mysql, sql1.c_str());
    370. res = mysql_store_result(&mysql);
    371. row = mysql_fetch_row(res);
    372. if (row == NULL)
    373. {
    374. std::cout << "不存在该分数的学生" << std::endl;
    375. break;
    376. }
    377. else
    378. sql2 = "delete from Student1 where score= " + std::to_string(score);
    379. std::cout << "删除的SQL语句如下:" << std::endl << sql2 << std::endl; // 检查语句
    380. mysql_query(&mysql, sql2.c_str());
    381. break;
    382. }
    383. default:
    384. std::cout << "您输入的选项有误,请重新输入" << std::endl;
    385. }
    386. }

    Students.cpp

    1. #include "Student.h"
    2. int Student::getId() {
    3. return Id;
    4. }
    5. std::string Student::getName() {
    6. return name;
    7. }
    8. int Student::getScore() {
    9. return score;
    10. }
    11. void Student::setId(int &id) {
    12. Id=id;
    13. }
    14. void Student::setName(std::string& Name) {
    15. name=Name;
    16. }
    17. void Student::setScore(int &Score) {
    18. score=Score;
    19. }

    student2.txt

    1. 学号 姓名 成绩
    2. 21 张三 98
    3. 22 李四 45
    CMakeLists.txt
    
    1. cmake_minimum_required(VERSION 3.20)
    2. project(new_projects)
    3. set(CMAKE_CXX_STANDARD 17)
    4. include_directories(include)
    5. include_directories(D:/develop/MySQL/MySQL\ Server\ 8.0/include)
    6. link_directories(D:/develop/MySQL/MySQL\ Server\ 8.0/lib)
    7. link_libraries(libmysql)
    8. aux_source_directory(src DIR_SRCS)
    9. add_executable(new_projects ${DIR_SRCS})
    AUTO_INCREMENT是主键,主键具有唯一性
  • 相关阅读:
    【牛客刷题】每日一练——Java语法的强化
    An动画优化之传统引导层动画
    Vue2:使用Vant UI实现网易云评论页上拉和下拉刷新
    Centos实现Mysql8.4安装及主主同步
    Linux--进程间通讯--FIFO(open打开)
    kafka是啥?虽然很难学,但是实验入门很简单
    pytorch nn.Embedding 读取gensim训练好的词/字向量(有例子)
    vue3中使用vue-i18n(ts中使用$t, vue3不用this)
    蓝桥杯实战应用【算法代码篇】-多分支递归:裴波那契序列(附Java、C++和R语言代码)
    SpringMVC:转发和重定向
  • 原文地址:https://blog.csdn.net/m0_61682542/article/details/136392859