当前位置:   article > 正文

C++操作MySQL_mysql c++

mysql c++

项目场景:

C++的课程设计,要用到mysql,花了点时间去查找资料把mysql的操作做了简单的封装。可以直接继承复用。


解决方案:

mysql_operate.h

  1. #pragma once
  2. #ifndef _MYSQL_OPERATE_H_
  3. #define _MYSQL_OPERATE_H_
  4. #include<iostream>
  5. using namespace std;
  6. #include<string>
  7. #include<Windows.h>
  8. #include<WinSock.h>
  9. #include<mysql.h>
  10. extern const int MAX_SQL_SENTENCE_LENGTH;
  11. class Mysql_Operate
  12. {
  13. public:
  14. Mysql_Operate();
  15. ~Mysql_Operate();
  16. //连接数据库 参数为ip 用户名 密码 数据库名 端口
  17. bool connect(const char* HOST, const char* USER, const char* PASSWORD, const char* DATABASE_NAME, const int PORT);
  18. // 封装后的操作函数
  19. template<class ... Args>
  20. void excute_sql(const char* format, Args ... args); // 可直接执行sql语句
  21. template<class ... Args>
  22. float get_one_request_of_float(const char* format, Args ... args); // 从数据库获取单个数据(int)
  23. template<class ... Args>
  24. char* get_one_request_of_str(const char* format, Args ... args); // 从数据库获取单个数据(str)
  25. template<class ... Args>
  26. MYSQL_ROW get_row_request_of_str(const char* format, Args ... args); // 从数据库获取整行数据(str)
  27. bool display__res(); // 打印结果集
  28. bool query_table(const char* table_name); //查询并打印表 参数为表名 这个函数不能使用别名 便捷的打印表的数据(可用来测试) 直接输入表的名称
  29. // 初步封装的函数
  30. int get__res_field_num(); //获取结果集的字段数
  31. int get__res_row_num(); // 返回结果集合中的行的数量 查询集为空返回0
  32. MYSQL_RES* query(); // 执行查询语句 返回查询集 底层操作函数(不直接调用)
  33. int get_tag_id(const char*); // 获取表的最后一行的id+1 (新行的id)
  34. protected:
  35. bool _state; //连接状态 true为已连接
  36. MYSQL* _mysql; //mysql连接
  37. MYSQL_RES* _res; //这个结构代表返回行的一个查询结果集
  38. MYSQL_ROW _column; //一个行数据的类型安全(type-safe)的表示,表示数据行的列
  39. char* _query; //查询语句 有的查询语句过长会导致内存不够 分配大一点
  40. int excute_status; // sql语句执行状态 成功、失败
  41. int _res_rows_num; // 结果集合中的行的数量 为0说明结果集为空
  42. int field_num; // 结果集中字段数
  43. string exit_params; // 退出操作参数
  44. };
  45. char* get_datetime(); // 返回字符串日期时间 往数据库录入当前时间
  46. // 封装的执行sql语句 执行成功返回1 失败返回0
  47. /*
  48. 使用方法:
  49. excute_sql("UPDATE app_produce_data SET is_delete = 1 WHERE id = %d", produce_id)直接输入sql语句
  50. */
  51. template<class ... Args>
  52. void Mysql_Operate::excute_sql(const char* format, Args ... args) {
  53. excute_status = 0; // 初始化状态参数
  54. _res_rows_num = 0; // 初始化结果集数据行数
  55. field_num = 0;
  56. sprintf_s(_query, MAX_SQL_SENTENCE_LENGTH, format, args...);
  57. if (query()) {
  58. excute_status = 1; // sql语句执行成功 excute_status = 1
  59. _res_rows_num = get__res_row_num(); // 结果集数据行数
  60. field_num = get__res_field_num();
  61. }
  62. else {
  63. excute_status = 0;
  64. _res_rows_num = 0;
  65. field_num = 0;
  66. }
  67. }
  68. /*
  69. 使用方法:
  70. get_one_request_of_int("SELECT produce_price FROM app_produce_data WHERE id='%d'", produce_id)直接输入sql语句
  71. */
  72. // 从数据库获取单个数据(int)
  73. template<class ... Args>
  74. float Mysql_Operate::get_one_request_of_float(const char* format, Args ... args) {
  75. excute_sql(format, args...);
  76. _column = mysql_fetch_row(_res); // 获取第一行
  77. //cout << atoi(_column[0]);
  78. return atof(_column[0]); // 返回值
  79. }
  80. /*
  81. 使用方法:
  82. get_one_request_of_str("SELECT produce_name FROM app_produce_data WHERE id = %d", produce_id), produce_id)直接输入sql语句
  83. */
  84. // 从数据库获取单个数据(str)
  85. template<class ... Args>
  86. char* Mysql_Operate::get_one_request_of_str(const char* format, Args ... args) {
  87. excute_sql(format, args...);
  88. _column = mysql_fetch_row(_res); // 获取第一行
  89. //cout << _column[0];
  90. return _column[0]; // 返回值
  91. }
  92. // 从数据库获取整行数据(str)
  93. template<class ... Args>
  94. MYSQL_ROW Mysql_Operate::get_row_request_of_str(const char* format, Args ... args) {
  95. excute_sql(format, args...);
  96. _column = mysql_fetch_row(_res); // 获取第一行
  97. //cout << _column[0];
  98. return _column; // 返回值
  99. }
  100. #endif // _MYSQL_OPERATE_H_

mysql_operate.cpp

  1. # include "mysql_operate.h"
  2. # include <sstream>
  3. # include <atltime.h>
  4. const int MAX_SQL_SENTENCE_LENGTH = 1000;
  5. // 数据库操作封装
  6. /*
  7. 1.void excute_sql(const char* format, Args ... args)
  8. 1.获取sql语句执行状态 接收字符串执行sql语句 sql语句执行成功excute_status = 1 失败excute_status = 0
  9. 2.获取结果集数据行数 _res_rows_num
  10. 2.bool display__res(int field_num) 1.打印查询集
  11. */
  12. // 构造函数
  13. Mysql_Operate::Mysql_Operate()
  14. {
  15. _state = false; // 连接状态
  16. _mysql = new MYSQL;
  17. _query = new char[MAX_SQL_SENTENCE_LENGTH]; // 分配内存
  18. _res = nullptr; // 初始化结果集
  19. _column = nullptr; // 初始化结果行
  20. memset(_query, NULL, sizeof(_query)); // 初始化查询语句
  21. connect("localhost", "root", "898678", "supermarket_data", 3306); //连接数据库 参数为ip、用户名、密码、数据库名、端口
  22. _res_rows_num = 0; // 结果集合中的行的数量 为0说明结果集为空
  23. field_num = 0; // 结果集中字段数
  24. exit_params = "0"; // 退出操作参数
  25. }
  26. // 析构函数
  27. Mysql_Operate::~Mysql_Operate()
  28. {
  29. }
  30. // 连接数据库
  31. bool Mysql_Operate::connect(const char* HOST, const char* USER, const char* PASSWORD, const char* DATABASE_NAME, const int PORT)
  32. {
  33. if (_state == true)
  34. {
  35. cout << "Connected succeed" << endl;
  36. return true;
  37. }
  38. //初始化mysql
  39. mysql_init(_mysql);
  40. //返回false则连接失败,返回true则连接成功
  41. if (!(mysql_real_connect(_mysql, HOST, USER, PASSWORD, DATABASE_NAME, PORT, NULL, 0))) // 主机用户名、密码、数据库名、端口号
  42. {
  43. printf("Error connecting to database:%s\n", mysql_error(_mysql));
  44. return false;
  45. }
  46. else
  47. {
  48. _state = true;
  49. return true;
  50. }
  51. }
  52. // 封装查询语句 返回结果集 执行失败返回nullptr
  53. MYSQL_RES* Mysql_Operate::query() {
  54. if (_state == false) // 判断数据库是否连接
  55. {
  56. printf("Database not connected\n");
  57. return false;
  58. }
  59. //设置编码格式(SET NAMES GBK也行),否则cmd下中文乱码
  60. mysql_query(_mysql, "set names gbk");
  61. MYSQL_RES* error = nullptr;
  62. // 获取查询结果 并进行查询结果判断
  63. if (mysql_query(_mysql, _query)) //执行SQL语句
  64. {
  65. printf("Query failed (%s)\n", mysql_error(_mysql));
  66. return error;
  67. }
  68. else
  69. {
  70. //printf("query success\n");
  71. }
  72. //获取结果集
  73. if (!(_res = mysql_store_result(_mysql))) //获得sql语句结束后返回的结果集
  74. {
  75. //printf("Couldn't get result from %s\n", mysql_error(_mysql));
  76. //return error;
  77. }
  78. if (_res == nullptr) {
  79. _res = new MYSQL_RES; // 区分 插入、更新数据时无返回结果集导致无法sql语句判断是否执行成功 不让_res == error
  80. }
  81. return _res;
  82. }
  83. // 打印结果集
  84. bool Mysql_Operate::display__res() {
  85. char* str_field[MAX_SQL_SENTENCE_LENGTH]; // 字段名
  86. for (int i = 0; i < field_num; i++) //在获得字段数量的情况下获取字段名
  87. {
  88. str_field[i] = mysql_fetch_field(_res)->name; // 返回下一个表字段名
  89. }
  90. //打印字段名 打印表的第一行字段名
  91. for (int i = 0; i < field_num; i++)
  92. {
  93. printf("%10s\t", str_field[i]);
  94. }
  95. printf("\n");
  96. //打印获取的数据
  97. while (_column = mysql_fetch_row(_res)) //在已知字段数量情况下,获取并打印下一行 无下一行后mysql_fetch_row返回false结束循环
  98. {
  99. for (int i = 0; i < field_num; i++)
  100. {
  101. printf("%10s\t", _column[i]); //column是列数组 一行包括多列
  102. }
  103. printf("\n");
  104. }
  105. return true;
  106. }
  107. // 返回结果集合中的行的数量 查询集为空返回0
  108. int Mysql_Operate::get__res_row_num() {
  109. return mysql_num_rows(_res);
  110. }
  111. // 返回结果集中的字段数
  112. int Mysql_Operate::get__res_field_num() {
  113. return mysql_field_count(_mysql);
  114. }
  115. // 查询表 直接传入表名
  116. bool Mysql_Operate::query_table(const char* table_name)
  117. {
  118. //查询内容
  119. if (!strcmp(table_name, "app_produce_data")) { // 如果为商品信息表 增加是否删除判断
  120. excute_sql("select * from %s WHERE is_delete = 0", table_name); //执行查询语句
  121. }
  122. else {
  123. excute_sql("select * from %s", table_name); //执行查询语句
  124. }
  125. //打印数据行数
  126. printf("number of dataline returned: %lld\n", mysql_affected_rows(_mysql));
  127. // 打印表数据
  128. display__res();
  129. return true;
  130. }
  131. // 获取表的最后一行的id 在此基础上加1 返回新的一行的id
  132. int Mysql_Operate::get_tag_id(const char* c) {
  133. //查询内容
  134. excute_sql("SELECT id FROM %s ORDER BY id DESC LIMIT 1", c);
  135. _column = mysql_fetch_row(_res);
  136. //printf("%10s\t", _column[0]); //column是列数组
  137. if (_column == nullptr) {
  138. return 1;
  139. }
  140. int row_num = atoi(_column[0]);
  141. return row_num + 1;
  142. }
  143. //int to string
  144. string inttostring(int in)
  145. {
  146. stringstream ss;
  147. string str;
  148. ss << in;
  149. ss >> str;
  150. return str;
  151. }
  152. // 返回字符串日期时间
  153. char* get_datetime() {
  154. //get the current time
  155. CTime t = CTime::GetCurrentTime();
  156. string mytime = inttostring(t.GetYear()) + "-" + inttostring(t.GetMonth()) + "-" + inttostring(t.GetDay())
  157. + " " + inttostring(t.GetHour()) + ":" + inttostring(t.GetMinute()) + ":" + inttostring(t.GetSecond());
  158. //cout << mytime << endl;
  159. static char sdate[30];
  160. strcpy_s(sdate, mytime.c_str());
  161. //cout << size(sdate) << endl;
  162. return sdate;
  163. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/663264
推荐阅读
相关标签
  

闽ICP备14008679号