MySQL·C/C++访问数据库

打印 上一主题 下一主题

主题 809|帖子 809|积分 2427

目录
准备工作
测试是否安装成功
C/C++语言访问
官方文档
接口介绍利用
mysql_init()
mysql_close() 
增补1:makefile编写
mysql_real_connect() 
测试1:编译链接
mysql_query()
测试2:SQL语句测试
改 



错误1:SQL语句错误
错误2:编码错误
mysql_set_character_set()
测试3:编码错误测试
查询的后序处置处罚
mysql_store_result()
mysql_num_rows() 
mysql_num_fields()
测试4:行列获取测试
mysql_fetch_row()
测试5:读取数据测试
mysql_fetch_fields()
测试6:读取数据测试
mysql_free_result()
增补2:事务
全部的测试代码


准备工作

起首我们创建一个用户 参考上文MySQL·用户管理-CSDN博客


赋予权限

登入与权限测试

方法一:动静态链接 
C库下载
   链接:MySQL :: MySQL Community Downloads
  

找到C版本支持的第三方库下载对应版本即可
方法二:yum源直接安装
参考下文: 
   MySQL卸载、安装、登入与配置_yum 卸载mysql-CSDN博客
  曾经安装过了,就不再演示了 


假如还是没有可以尝试直接安装
  1. yum install mysql-devel
复制代码
假如是一起看过来的话,可能你们的yum源必要更新了,我利用的源现在是有一些是无法访问的,但是到现在还没有什么影响,以是为了防止出现意外,就继续利用了。具体错误如下


测试是否安装成功

这是一个返回MySQL版本的一个函数,我们可以用它来做测试 
  1. #include <iostream>
  2. #include <mysql/mysql.h>
  3. int main()
  4. {
  5.     std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;
  6.     return 0;
  7. }
复制代码
 直接编译是无法成功的,我们必要指定动态库


只指明库名也是无法成功的,我们还必要添加路径

  1. g++ -o mytest test.cc -L/lib64/mysql/ -lmysqlclient
复制代码
如许我们发现编译成功了,而且成功返回了MySQL的版本号

没有找到可以是由于这个的指明是无法找到,必要重新配置环境

你可能必要把环境添加到这里面来 

通常环境下,MySQL的安装程序会自动配置好所需的环境变量和库路径,你可能不必要手动进行这些操作。
解决方法可以参考下面这里的答复

假如在头文件中不指明文件夹的话,则必要在编译指令中添加文件夹
  1. #include <iostream>
  2. #include <mysql.h>
  3. int main()
  4. {
  5.     std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;
  6.     return 0;
  7. }
复制代码
直接编译会报错 

添加大 -I 选项 

C/C++语言访问

官方文档

   MySQL :: MySQL Documentation
  找到C的,对应版本 
 
   官方接口 :MySQL :: MySQL 5.7 C API Developer Guide :: 4 C API Function Reference
  

接口介绍利用

mysql_init()

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.37 mysql_init()
创建一个mysql类的布局体

MySQL类里面就是一些信息

mysql_close() 

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.5 mysql_close()
关闭释放这个句柄 

创建而且关闭 
  1. #include <iostream>
  2. #include <mysql/mysql.h>
  3. int main()
  4. {
  5.     // std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;
  6.     // 创建一个mysql句柄
  7.     MYSQL *my = mysql_init(nullptr);
  8.     if(nullptr == my)
  9.     {
  10.         std::cerr << "init MySQL error" << std::endl;
  11.         return 1;
  12.     }
  13.     // 关闭释放该句柄
  14.     mysql_close(my);
  15.     return 0;
  16. }
复制代码
 
编译测试 

增补1:makefile编写

  1. mytest:test.cc
  2.         g++ -o $@ $^ -std=c++11 -L/lib64/mysql -lmysqlclient
  3. .PHONY:clean
  4. clean:
  5.         rm -f mytest
  6. #上面的原式 g++ -o mytest test.cc -std=c++11 -L/lib64/mysql -lmysqlclient
  7. #其中$@ $^表示自动变量,前者表示目标项,后者表示全部依赖项,$<表示第一个依赖项
复制代码
mysql_real_connect() 

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.54 mysql_real_connect() 
链接数据库 

  1. #include <iostream>
  2. #include <string>
  3. #include <mysql/mysql.h>
  4. // const std::string host = "127.0.0.1";
  5. const std::string host = "localhost";   // 使用本地回环也可以
  6. const std::string user = "connector";
  7. const std::string passwd = "123456";
  8. const std::string db = "conn";
  9. const unsigned int port = 8080;
  10. int main()
  11. {
  12.     // std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;
  13.     // 创建一个mysql句柄
  14.     MYSQL *my = mysql_init(nullptr);
  15.     if(nullptr == my)
  16.     {
  17.         std::cerr << "init MySQL error" << std::endl;
  18.         return 1;
  19.     }
  20.     if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
  21.     {
  22.         std::cerr << "connect MySQL error" << std::endl;
  23.         return 2;
  24.     }
  25.     std::cout << "connnect success" << std::endl;
  26.     // 关闭释放该句柄
  27.     mysql_close(my);
  28.     return 0;
  29. }
复制代码
 
测试1:编译链接

  
为了方便演示,我们先创建一张表
  1. create table user(
  2.     id bigint primary key auto_increment,
  3.     name varchar(32) not null,
  4.     age int not null,
  5.     telphone varchar(32) unique
  6.     );
复制代码

显然这里是没有什么题目标
我们可以通过下面这条SQL语句检察当前链接的用户信息 
  1. show processlist;
复制代码
 
我们对代码进行修改,让它不要这么快退出,让我们看到链接的信息
  1. #include <iostream>
  2. #include <unistd.h>
  3. #include <string>
  4. #include <mysql/mysql.h>
  5. // const std::string host = "127.0.0.1";
  6. const std::string host = "localhost";   // 使用本地回环也可以
  7. const std::string user = "connector";
  8. const std::string passwd = "123456";
  9. const std::string db = "conn";
  10. const unsigned int port = 8080;
  11. int main()
  12. {
  13.     // std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;
  14.     // 创建一个mysql句柄
  15.     MYSQL *my = mysql_init(nullptr);
  16.     if(nullptr == my)
  17.     {
  18.         std::cerr << "init MySQL error" << std::endl;
  19.         return 1;
  20.     }
  21.     if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
  22.     {
  23.         std::cerr << "connect MySQL error" << std::endl;
  24.         return 2;
  25.     }
  26.     sleep(10);
  27.     std::cout << "connnect success" << std::endl;
  28.     // 关闭释放该句柄
  29.     mysql_close(my);
  30.     return 0;
  31. }
复制代码
这一次我们看到了 

显然现在没有出现什么错误
mysql_query()

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.53 mysql_query()
下达指令 


  1. #include <iostream>
  2. #include <unistd.h>
  3. #include <string>
  4. #include <mysql/mysql.h>
  5. // const std::string host = "127.0.0.1";
  6. const std::string host = "localhost";   // 使用本地回环也可以
  7. const std::string user = "connector";
  8. const std::string passwd = "123456";
  9. const std::string db = "conn";
  10. const unsigned int port = 8080;
  11. int main()
  12. {
  13.     // std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;
  14.     // 创建一个mysql句柄
  15.     MYSQL *my = mysql_init(nullptr);
  16.     if(nullptr == my)
  17.     {
  18.         std::cerr << "init MySQL error" << std::endl;
  19.         return 1;
  20.     }
  21.     if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
  22.     {
  23.         std::cerr << "connect MySQL error" << std::endl;
  24.         return 2;
  25.     }
  26.     std::string sql;
  27.     while(true)
  28.     {
  29.         std::cout << "MySQL>>> ";
  30.         if(!std::getline(std::cin, sql) || sql == "quit")
  31.         {
  32.             std::cout << "bye bye" << std::endl;
  33.             break;
  34.         }
  35.         int n = mysql_query(my, sql.c_str());
  36.         if(n == 0)
  37.         {
  38.             std::cout << sql << " success: " << n << std::endl;
  39.         }
  40.         else
  41.         {
  42.             std::cerr << sql << " failed: " << n << std::endl;
  43.         }
  44.     }
  45.     // sleep(10);
  46.     // std::cout << "connnect success" << std::endl;
  47.     // 关闭释放该句柄
  48.     mysql_close(my);
  49.     return 0;
  50. }
复制代码
 
测试2:SQL语句测试


改 

不外实在我们并不必要这么麻烦去写一个MySQL的客户端,我们只必要利用即可
  1. #include <iostream>
  2. #include <unistd.h>
  3. #include <string>
  4. #include <mysql/mysql.h>
  5. // const std::string host = "127.0.0.1";
  6. const std::string host = "localhost";   // 使用本地回环也可以
  7. const std::string user = "connector";
  8. const std::string passwd = "123456";
  9. const std::string db = "conn";
  10. const unsigned int port = 8080;
  11. int main()
  12. {
  13.     // std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;
  14.     // 创建一个mysql句柄
  15.     MYSQL *my = mysql_init(nullptr);
  16.     if(nullptr == my)
  17.     {
  18.         std::cerr << "init MySQL error" << std::endl;
  19.         return 1;
  20.     }
  21.     if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
  22.     {
  23.         std::cerr << "connect MySQL error" << std::endl;
  24.         return 2;
  25.     }
  26.     std::string sql = "update user set name='Jimmy' where id=2";
  27.     int n = mysql_query(my, sql.c_str());
  28.     if(n == 0) std::cout << sql << " success: " << n << std::endl;
  29.     else std::cerr << sql << " failed: " << n << std::endl;
  30.     /*
  31.     // 其实我们并不需要这么麻烦去写一个MySQL的客户端,我们只需要使用即可
  32.     std::string sql;
  33.     while(true)
  34.     {
  35.         std::cout << "MySQL>>> ";
  36.         if(!std::getline(std::cin, sql) || sql == "quit")
  37.         {
  38.             std::cout << "bye bye" << std::endl;
  39.             break;
  40.         }
  41.         int n = mysql_query(my, sql.c_str());
  42.         if(n == 0)
  43.         {
  44.             std::cout << sql << " success: " << n << std::endl;
  45.         }
  46.         else
  47.         {
  48.             std::cerr << sql << " failed: " << n << std::endl;
  49.         }
  50.     }
  51.     */
  52.     // sleep(10);
  53.     // std::cout << "connnect success" << std::endl;
  54.     // 关闭释放该句柄
  55.     mysql_close(my);
  56.     return 0;
  57. }
复制代码

显然这里是没有出现什么错误的,我们能够利用语言来实现对数据的控制
下面进行增删改查测试
  1. #include <iostream>
  2. #include <unistd.h>
  3. #include <string>
  4. #include <mysql/mysql.h>
  5. // const std::string host = "127.0.0.1";
  6. const std::string host = "localhost";   // 使用本地回环也可以
  7. const std::string user = "connector";
  8. const std::string passwd = "123456";
  9. const std::string db = "conn";
  10. const unsigned int port = 8080;
  11. int main()
  12. {
  13.     // std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;
  14.     // 创建一个mysql句柄
  15.     MYSQL *my = mysql_init(nullptr);
  16.     if(nullptr == my)
  17.     {
  18.         std::cerr << "init MySQL error" << std::endl;
  19.         return 1;
  20.     }
  21.     if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
  22.     {
  23.         std::cerr << "connect MySQL error" << std::endl;
  24.         return 2;
  25.     }
  26.     // std::string sql = "update user set name='Jimmy' where id=2"; // 改
  27.     // std::string sql = "insert into user (name, age, telphone) values ('peter', 19, '987654321')";
  28.     // std::string sql = "delete from user where id=1";
  29.     std::string sql = "select * from user";
  30.     int n = mysql_query(my, sql.c_str());
  31.     if(n == 0) std::cout << sql << " success: " << n << std::endl;
  32.     else std::cerr << sql << " failed: " << n << std::endl;
  33.     /*
  34.     // 其实我们并不需要这么麻烦去写一个MySQL的客户端,我们只需要使用即可
  35.     std::string sql;
  36.     while(true)
  37.     {
  38.         std::cout << "MySQL>>> ";
  39.         if(!std::getline(std::cin, sql) || sql == "quit")
  40.         {
  41.             std::cout << "bye bye" << std::endl;
  42.             break;
  43.         }
  44.         int n = mysql_query(my, sql.c_str());
  45.         if(n == 0)
  46.         {
  47.             std::cout << sql << " success: " << n << std::endl;
  48.         }
  49.         else
  50.         {
  51.             std::cerr << sql << " failed: " << n << std::endl;
  52.         }
  53.     }
  54.     */
  55.     // sleep(10);
  56.     // std::cout << "connnect success" << std::endl;
  57.     // 关闭释放该句柄
  58.     mysql_close(my);
  59.     return 0;
  60. }
复制代码








我们会发现这个操作是无法进行的,由于查是这四种操作最欠好处置处罚的,由于这个消息并不是让服务端去表现,在利用的时候,我们肯定是要让用户去看到这个查的消息,这个我们在后面进行详细介绍


 
错误1:SQL语句错误

从这里看到,当用户传递的SQL语句不正确的时候,MySQL的服务端是不会进行处置处罚的,当然这也是我们可以预料到的,由于MySQL包管对数据的操作,只要是成功的,就一定是正确的SQL语句,反之假如失败的,就一定是错误的语句

错误2:编码错误

我们可以看到,这里插入中文的话,是会出现乱码的,但是我们知道的,在一开始我们就已经配置好了MySQL的编码格式,那么为什么这里还是会出现呢?

如下我们配置里面是利用的utf8的

        这实在是由于编码的不同等导致的,建立好链接之后,获取英文没有题目,假如获取中文是乱码:设置链接的默认字符集是utf8,原始默认是latin1
mysql_set_character_set()

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.69 mysql_set_character_set()
设置编码格式
测试3:编码错误测试

  1. #include <iostream>
  2. #include <unistd.h>
  3. #include <string>
  4. #include <mysql/mysql.h>
  5. // const std::string host = "127.0.0.1";
  6. const std::string host = "localhost";   // 使用本地回环也可以
  7. const std::string user = "connector";
  8. const std::string passwd = "123456";
  9. const std::string db = "conn";
  10. const unsigned int port = 8080;
  11. int main()
  12. {
  13.     // std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;
  14.     // 创建一个mysql句柄
  15.     MYSQL *my = mysql_init(nullptr);
  16.     if(nullptr == my)
  17.     {
  18.         std::cerr << "init MySQL error" << std::endl;
  19.         return 1;
  20.     }
  21.     if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
  22.     {
  23.         std::cerr << "connect MySQL error" << std::endl;
  24.         return 2;
  25.     }
  26.     mysql_set_character_set(my, "utf8");
  27.     // std::string sql = "update user set name='Jimmy' where id=2"; // 改
  28.     // std::string sql = "insert into user (name, age, telphone) values ('peter', 19, '987654321')";
  29.     // std::string sql = "delete from user where id=1";
  30.     // std::string sql = "select * from user";
  31.     std::string sql = "insert into user (name, age, telphone) values ('张三', 19, '666666666')";
  32.     int n = mysql_query(my, sql.c_str());
  33.     if(n == 0) std::cout << sql << " success: " << n << std::endl;
  34.     else std::cerr << sql << " failed: " << n << std::endl;
  35.     /*
  36.     // 其实我们并不需要这么麻烦去写一个MySQL的客户端,我们只需要使用即可
  37.     std::string sql;
  38.     while(true)
  39.     {
  40.         std::cout << "MySQL>>> ";
  41.         if(!std::getline(std::cin, sql) || sql == "quit")
  42.         {
  43.             std::cout << "bye bye" << std::endl;
  44.             break;
  45.         }
  46.         int n = mysql_query(my, sql.c_str());
  47.         if(n == 0)
  48.         {
  49.             std::cout << sql << " success: " << n << std::endl;
  50.         }
  51.         else
  52.         {
  53.             std::cerr << sql << " failed: " << n << std::endl;
  54.         }
  55.     }
  56.     */
  57.     // sleep(10);
  58.     // std::cout << "connnect success" << std::endl;
  59.     // 关闭释放该句柄
  60.     mysql_close(my);
  61.     return 0;
  62. }
复制代码
这下插入就没有编码不同等带来的乱码了


查询的后序处置处罚

mysql_store_result()

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.77 mysql_store_result()
把查询到的结果转存到某个地方,MYSQL_RES


MYSQL_RES的内容实在就是一个布局体

mysql_num_rows() 

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.49 mysql_num_rows()
拿取行 


mysql_num_fields()

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.48 mysql_num_fields()
拿取列 
 
此中 my_ulonglong 实在就是 unsigned long long 范例的数据
 
测试4:行列获取测试

  1. #include <iostream>
  2. #include <unistd.h>
  3. #include <string>
  4. #include <mysql/mysql.h>
  5. // const std::string host = "127.0.0.1";
  6. const std::string host = "localhost";   // 使用本地回环也可以
  7. const std::string user = "connector";
  8. const std::string passwd = "123456";
  9. const std::string db = "conn";
  10. const unsigned int port = 8080;
  11. int main()
  12. {
  13.     // std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;
  14.     // 创建一个mysql句柄
  15.     MYSQL *my = mysql_init(nullptr);
  16.     if(nullptr == my)
  17.     {
  18.         std::cerr << "init MySQL error" << std::endl;
  19.         return 1;
  20.     }
  21.     if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
  22.     {
  23.         std::cerr << "connect MySQL error" << std::endl;
  24.         return 2;
  25.     }
  26.     mysql_set_character_set(my, "utf8");
  27.     // std::string sql = "update user set name='Jimmy' where id=2"; // 改
  28.     // std::string sql = "insert into user (name, age, telphone) values ('peter', 19, '987654321')";
  29.     // std::string sql = "delete from user where id=4";
  30.     // std::string sql = "insert into user (name, age, telphone) values ('张三', 19, '666666666')";
  31.     std::string sql = "select * from user";
  32.     int n = mysql_query(my, sql.c_str());
  33.     if(n == 0) std::cout << sql << " success: " << n << std::endl;
  34.     else
  35.     {
  36.         std::cerr << sql << " failed: " << n << std::endl;
  37.         return 3;
  38.     }
  39.     MYSQL_RES *res = mysql_store_result(my);
  40.     if(nullptr == res)
  41.     {
  42.         std::cerr << "mysql_store_result error" << std::endl;
  43.         return 4;
  44.     }
  45.     my_ulonglong rows = mysql_num_rows(res); // 拿取行
  46.     my_ulonglong fields = mysql_num_fields(res); // 拿取列
  47.     std::cout << "行: " << rows << std::endl;
  48.     std::cout << "列: " << fields << std::endl;
  49.     /*
  50.     // 其实我们并不需要这么麻烦去写一个MySQL的客户端,我们只需要使用即可
  51.     std::string sql;
  52.     while(true)
  53.     {
  54.         std::cout << "MySQL>>> ";
  55.         if(!std::getline(std::cin, sql) || sql == "quit")
  56.         {
  57.             std::cout << "bye bye" << std::endl;
  58.             break;
  59.         }
  60.         int n = mysql_query(my, sql.c_str());
  61.         if(n == 0)
  62.         {
  63.             std::cout << sql << " success: " << n << std::endl;
  64.         }
  65.         else
  66.         {
  67.             std::cerr << sql << " failed: " << n << std::endl;
  68.         }
  69.     }
  70.     */
  71.     // sleep(10);
  72.     // std::cout << "connnect success" << std::endl;
  73.     // 关闭释放该句柄
  74.     mysql_close(my);
  75.     return 0;
  76. }
复制代码
看到结果,我们确实拿到了具体的行和列 

当我们测试拿取一条数据的时候,也是正确的,用where进行筛选



mysql_fetch_row()

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.21 mysql_fetch_row()
自动迭代遍历,获取数据


一个新的宏,MYSQL_ROW ,实在就是一个指针,我们将其看做一个指向一个二维数组的指针就行了

测试5:读取数据测试

  1. #include <iostream>
  2. #include <unistd.h>
  3. #include <string>
  4. #include <mysql/mysql.h>
  5. // const std::string host = "127.0.0.1";
  6. const std::string host = "localhost";   // 使用本地回环也可以
  7. const std::string user = "connector";
  8. const std::string passwd = "123456";
  9. const std::string db = "conn";
  10. const unsigned int port = 8080;
  11. int main()
  12. {
  13.     // std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;
  14.     // 创建一个mysql句柄
  15.     MYSQL *my = mysql_init(nullptr);
  16.     if(nullptr == my)
  17.     {
  18.         std::cerr << "init MySQL error" << std::endl;
  19.         return 1;
  20.     }
  21.     if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
  22.     {
  23.         std::cerr << "connect MySQL error" << std::endl;
  24.         return 2;
  25.     }
  26.     mysql_set_character_set(my, "utf8");
  27.     // std::string sql = "update user set name='Jimmy' where id=2"; // 改
  28.     // std::string sql = "insert into user (name, age, telphone) values ('peter', 19, '987654321')";
  29.     // std::string sql = "delete from user where id=4";
  30.     // std::string sql = "insert into user (name, age, telphone) values ('张三', 19, '666666666')";
  31.     // std::string sql = "select * from user where id=3";
  32.     std::string sql = "select * from user";
  33.     int n = mysql_query(my, sql.c_str());
  34.     if(n == 0) std::cout << sql << " success: " << n << std::endl;
  35.     else
  36.     {
  37.         std::cerr << sql << " failed: " << n << std::endl;
  38.         return 3;
  39.     }
  40.     MYSQL_RES *res = mysql_store_result(my);
  41.     if(nullptr == res)
  42.     {
  43.         std::cerr << "mysql_store_result error" << std::endl;
  44.         return 4;
  45.     }
  46.     // 到这里都是和结果集有关的,MYSQL_RES
  47.     my_ulonglong rows = mysql_num_rows(res); // 拿取行
  48.     my_ulonglong fields = mysql_num_fields(res); // 拿取列
  49.     std::cout << "行: " << rows << std::endl;
  50.     std::cout << "列: " << fields << std::endl;
  51.     // 将其当作一个二维数组去遍历即可
  52.     for(my_ulonglong i = 0; i < rows; ++i)
  53.     {
  54.        MYSQL_ROW row = mysql_fetch_row(res);    // 和迭代器很像,会自己维护一个指针,自动遍历
  55.        for(my_ulonglong j = 0; j < fields; ++j)
  56.        {
  57.             std::cout << row[j] << "\t"; // *(row+j) 其实就是解引用
  58.        }
  59.        std::cout << std::endl;
  60.     }
  61.     /*
  62.     // 其实我们并不需要这么麻烦去写一个MySQL的客户端,我们只需要使用即可
  63.     std::string sql;
  64.     while(true)
  65.     {
  66.         std::cout << "MySQL>>> ";
  67.         if(!std::getline(std::cin, sql) || sql == "quit")
  68.         {
  69.             std::cout << "bye bye" << std::endl;
  70.             break;
  71.         }
  72.         int n = mysql_query(my, sql.c_str());
  73.         if(n == 0)
  74.         {
  75.             std::cout << sql << " success: " << n << std::endl;
  76.         }
  77.         else
  78.         {
  79.             std::cerr << sql << " failed: " << n << std::endl;
  80.         }
  81.     }
  82.     */
  83.     // sleep(10);
  84.     // std::cout << "connnect success" << std::endl;
  85.     // 关闭释放该句柄
  86.     mysql_close(my);
  87.     return 0;
  88. }
复制代码
可以看到我们拿取到了结果,而且没有错误


mysql_fetch_fields()

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.19 mysql_fetch_fields()
获取列名信息 
 
MYSQL_FIELD


这里是不是很熟悉,这里就是MySQL里面的那一套 
 
 
测试6:读取数据测试


  1. #include <iostream>
  2. #include <unistd.h>
  3. #include <string>
  4. #include <mysql/mysql.h>
  5. // const std::string host = "127.0.0.1";
  6. const std::string host = "localhost";   // 使用本地回环也可以
  7. const std::string user = "connector";
  8. const std::string passwd = "123456";
  9. const std::string db = "conn";
  10. const unsigned int port = 8080;
  11. int main()
  12. {
  13.     // std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;
  14.     // 创建一个mysql句柄
  15.     MYSQL *my = mysql_init(nullptr);
  16.     if(nullptr == my)
  17.     {
  18.         std::cerr << "init MySQL error" << std::endl;
  19.         return 1;
  20.     }
  21.     if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
  22.     {
  23.         std::cerr << "connect MySQL error" << std::endl;
  24.         return 2;
  25.     }
  26.     mysql_set_character_set(my, "utf8");
  27.     // std::string sql = "update user set name='Jimmy' where id=2"; // 改
  28.     // std::string sql = "insert into user (name, age, telphone) values ('peter', 19, '987654321')";
  29.     // std::string sql = "delete from user where id=4";
  30.     // std::string sql = "insert into user (name, age, telphone) values ('张三', 19, '666666666')";
  31.     // std::string sql = "select * from user where id=3";
  32.     std::string sql = "select * from user";
  33.     int n = mysql_query(my, sql.c_str());
  34.     if(n == 0) std::cout << sql << " success: " << n << std::endl;
  35.     else
  36.     {
  37.         std::cerr << sql << " failed: " << n << std::endl;
  38.         return 3;
  39.     }
  40.     MYSQL_RES *res = mysql_store_result(my);
  41.     if(nullptr == res)
  42.     {
  43.         std::cerr << "mysql_store_result error" << std::endl;
  44.         return 4;
  45.     }
  46.     // 到这里都是和结果集有关的,MYSQL_RES
  47.     my_ulonglong rows = mysql_num_rows(res); // 拿取行
  48.     my_ulonglong fields = mysql_num_fields(res); // 拿取列
  49.     std::cout << "行: " << rows << std::endl;
  50.     std::cout << "列: " << fields << std::endl;
  51.     // 将其当作一个二维数组去遍历即可
  52.     // 读取属性
  53.     MYSQL_FIELD *fields_arry = mysql_fetch_fields(res);
  54.     for(my_ulonglong i = 0; i < fields; i++)
  55.     {
  56.         std::cout << fields_arry[i].name << "\t";
  57.     }
  58.     std::cout << "\n";
  59.     // 读取内容
  60.     for(my_ulonglong i = 0; i < rows; ++i)
  61.     {
  62.        MYSQL_ROW row = mysql_fetch_row(res);    // 和迭代器很像,会自己维护一个指针,自动遍历
  63.        for(my_ulonglong j = 0; j < fields; ++j)
  64.        {
  65.             std::cout << row[j] << "\t"; // *(row+j) 其实就是解引用
  66.        }
  67.        std::cout << std::endl;
  68.     }
  69.     // 读取数据库名,表名
  70.     std::cout << fields_arry[0].db << " " << fields_arry[0].table << std::endl;
  71.     /*
  72.     // 其实我们并不需要这么麻烦去写一个MySQL的客户端,我们只需要使用即可
  73.     std::string sql;
  74.     while(true)
  75.     {
  76.         std::cout << "MySQL>>> ";
  77.         if(!std::getline(std::cin, sql) || sql == "quit")
  78.         {
  79.             std::cout << "bye bye" << std::endl;
  80.             break;
  81.         }
  82.         int n = mysql_query(my, sql.c_str());
  83.         if(n == 0)
  84.         {
  85.             std::cout << sql << " success: " << n << std::endl;
  86.         }
  87.         else
  88.         {
  89.             std::cerr << sql << " failed: " << n << std::endl;
  90.         }
  91.     }
  92.     */
  93.     // sleep(10);
  94.     // std::cout << "connnect success" << std::endl;
  95.     // 关闭释放该句柄
  96.     mysql_close(my);
  97.     return 0;
  98. }
复制代码

我们可以看到,实在MySQL的客户端本质上就是对这些数据进行处置处罚,本身就是看做对字符串的处置处罚,原理很简单
mysql_free_result()

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.25 mysql_free_result()
释放结果集 

官方提供了专门用来释放结果集的函数

利用起来也很简单,就像C++里面的free函数一样就行 
  1. mysql_free_result(res);
复制代码

增补2:事务

我们都知道每一次的单SQL语句在MySQL看来都是一个事务,以是我们这里并没有测试事务的启动和提交,我们知道这一点就行了,通常我们会把一堆SQL语句放一起提交,那么MySQL就会把它当成一个事务,以是我们在代码上一样平常也不怎么讨论事务的启动和提交,当然了我们也可以开启事务,MySQL也提供了相应的函数好比下面这几个
  1. my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode);
  2. my_bool STDCALL mysql_commit(MYSQL * mysql);
  3. my_bool STDCALL mysql_rollback(MYSQL * mysql);
复制代码
实在我们也可以用mysql_query()这个提交来开启事务,好比提交begin,commit,rollback都能够实现,看自己需求

全部的测试代码

  1. #include <iostream>
  2. #include <unistd.h>
  3. #include <string>
  4. #include <mysql/mysql.h>
  5. // const std::string host = "127.0.0.1";
  6. const std::string host = "localhost";   // 使用本地回环也可以
  7. const std::string user = "connector";
  8. const std::string passwd = "123456";
  9. const std::string db = "conn";
  10. const unsigned int port = 8080;
  11. int main()
  12. {
  13.     // std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;
  14.     // 创建一个mysql句柄
  15.     MYSQL *my = mysql_init(nullptr);
  16.     if(nullptr == my)
  17.     {
  18.         std::cerr << "init MySQL error" << std::endl;
  19.         return 1;
  20.     }
  21.     if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
  22.     {
  23.         std::cerr << "connect MySQL error" << std::endl;
  24.         return 2;
  25.     }
  26.     mysql_set_character_set(my, "utf8");
  27.     // std::string sql = "update user set name='Jimmy' where id=2"; // 改
  28.     // std::string sql = "insert into user (name, age, telphone) values ('peter', 19, '987654321')";
  29.     // std::string sql = "delete from user where id=4";
  30.     // std::string sql = "insert into user (name, age, telphone) values ('张三', 19, '666666666')";
  31.     // std::string sql = "select * from user where id=3";
  32.     std::string sql = "select * from user";
  33.     int n = mysql_query(my, sql.c_str());
  34.     if(n == 0) std::cout << sql << " success: " << n << std::endl;
  35.     else
  36.     {
  37.         std::cerr << sql << " failed: " << n << std::endl;
  38.         return 3;
  39.     }
  40.     MYSQL_RES *res = mysql_store_result(my);
  41.     if(nullptr == res)
  42.     {
  43.         std::cerr << "mysql_store_result error" << std::endl;
  44.         return 4;
  45.     }
  46.     // 到这里都是和结果集有关的,MYSQL_RES
  47.     my_ulonglong rows = mysql_num_rows(res); // 拿取行
  48.     my_ulonglong fields = mysql_num_fields(res); // 拿取列
  49.     std::cout << "行: " << rows << std::endl;
  50.     std::cout << "列: " << fields << std::endl;
  51.     // 将其当作一个二维数组去遍历即可
  52.     // 读取属性
  53.     MYSQL_FIELD *fields_arry = mysql_fetch_fields(res);
  54.     for(my_ulonglong i = 0; i < fields; i++)
  55.     {
  56.         std::cout << fields_arry[i].name << "\t";
  57.     }
  58.     std::cout << "\n";
  59.     // 读取内容
  60.     for(my_ulonglong i = 0; i < rows; ++i)
  61.     {
  62.        MYSQL_ROW row = mysql_fetch_row(res);    // 和迭代器很像,会自己维护一个指针,自动遍历
  63.        for(my_ulonglong j = 0; j < fields; ++j)
  64.        {
  65.             std::cout << row[j] << "\t"; // *(row+j) 其实就是解引用
  66.        }
  67.        std::cout << std::endl;
  68.     }
  69.     // 读取数据库名,表名
  70.     std::cout << fields_arry[0].db << " " << fields_arry[0].table << std::endl;
  71.     /*
  72.     // 其实我们并不需要这么麻烦去写一个MySQL的客户端,我们只需要使用即可
  73.     std::string sql;
  74.     while(true)
  75.     {
  76.         std::cout << "MySQL>>> ";
  77.         if(!std::getline(std::cin, sql) || sql == "quit")
  78.         {
  79.             std::cout << "bye bye" << std::endl;
  80.             break;
  81.         }
  82.         int n = mysql_query(my, sql.c_str());
  83.         if(n == 0)
  84.         {
  85.             std::cout << sql << " success: " << n << std::endl;
  86.         }
  87.         else
  88.         {
  89.             std::cerr << sql << " failed: " << n << std::endl;
  90.         }
  91.     }
  92.     */
  93.     // sleep(10);
  94.     // std::cout << "connnect success" << std::endl;
  95.     // 关闭释放该句柄
  96.     mysql_free_result(res);
  97.     mysql_close(my);
  98.     return 0;
  99. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

没腿的鸟

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表