「MySQL-04」Linux环境下使用C/C++连接并使用MySQL

打印 上一主题 下一主题

主题 513|帖子 513|积分 1549

目录
   一、预备mysql库:Connector/C
  1. 查看是否有mysql干系的库和头文件
  2. 安装devel(开发库)
  3.到官网下载开发包,并上传到Linux
  3.0 须知
  3.1 到官网下载开发包
  3.2 上传安装包至Linux
  二、mysql库:Connector/C 的使用
  1. 创建并初始化mysql对象
  2. 烧毁mysql对象
  3. 链接数据库
  4. 设置编码格式
  5. 下发SQL语句给数据库
  6. 获取执行sql语句的结果
  6.1 从myql对象里读取结果
  6.2 从MYSQL_RES对象里获取行数
  6.3 从MYSQL_RES对象里获取列数
  6.4 从MYSQL_RES对象里获取列名
  6.5 从MYSQL_RES对象里一行一行的读取结果
  拓展】Connector/C库还支持事务等常用操作 
  练习】使用Connector/C库编写一个浅易的mysql客户端
  
一、预备mysql库:Connector/C

           要使用C/C++连接mysql,需要devel(开发库),一般来说在Linux上下好了MySQL这个库也会顺带给我们下载好。如果没有也可以单独安装。
  1. 查看是否有mysql干系的库和头文件

   

  • 使用命令 rpm -qa | grep mysql 查看是否有mysql干系的库,重点是devel(开发库):
          

  

  • 使用命令 ls /lib64/mysql/ -al 查看库的链接环境
          

  

  • 使用命令 ls /usr/include/mysql/ 查看mysql干系的头文件:
          

    2. 安装devel(开发库)

     如果只是缺少devel(开发库)可尝试用yum安装
   yum install -y mysql-community-devel
   
   安装好devel(开发库)后:
   我们只需要用 #include <mysql/mysql.h>  就可引入mysql库。
   编译时加上:-L/lib64/mysql -lmysqlclient 资助编译器找到头文件和库即可。
    3.到官网下载开发包,并上传到Linux

       3.0 须知

           如果无法安装devel(开发库),还可以到官网下载开发包,再上传到Linux,但是不保举怎么做,因为可能会因为开发包和自己MySQL的版本不同而出现各种奇希奇怪的题目:如ssl证书题目,套接字题目……
           所以能不如许做尽量不要如许做,要用这个方法还不如看博主文章重新安装MySQL。
   按照内里的方法一定能安装好mysql和devel(开发库)。
   
   3.1 到官网下载开发包

   a. 官网下载Download Archives
      
   
   b. 选择MySQL Connector/C
  

  
  c. 选择体系和版本。下图为Linux版的下载。
     
   
  3.2 上传安装包至Linux

  a. 上传安装包: rz -y
  

  
  b. 解压: tar -xzvf mysql-connector-c-6.1.11-linux-glibc2.12-x86_64.tar.gz
  

  
  c. 在要使用库的目录下建立头文件的软链接和库的软链接
  

  
  d. 修改设置文件让g++编译时能找到动态库
  如果提示找不到动态库libmysqlclient,我们还需要修改设置文件(以下命令建议在root用户下执行):
  1. 添加设置文件:vim /etc/ld.so.conf.d/lib_search.conf
  2. 往内里加入 mysql库中lib目录的路径:
          路径获取方式:cd进入刚才解压好的文件中,使用pwd lib查看lib目录的路径
  3. 然后运行指令 sudo ldconfig 更新设置文件
  
  e. 写代码时要引入头文件 "软链接地址/mysql.h"
  编译时要加上 -I./头文件的软链接地址/include -L./库的软链接地址 -lmysqlclient 资助编译器找到头文件和库。
  
二、mysql库:Connector/C 的使用

1. 创建并初始化mysql对象

  1. 函数:
  2.     mysql_init()
  3. 示例:
  4.     MYSQL *mysql = mysql_init(NULL);
复制代码
2. 烧毁mysql对象

  1. 函数:
  2.     mysql_close(要销毁的对象);
  3. 示例:
  4.     mysql_close(mysql);
复制代码
3. 链接数据库

   初始化完毕之后,必须先链接数据库,在进行后续操作。(mysql网络部分是基于TCP/IP的)
   
  1. 函数:
  2.     mysql_real_connect(mysql, host, user, passwd, db, port, unix_socket, clientflag)
  3.     //使用指定用户登录指定数据库,该用户必须有远程访问权限
  4. 参数说明:
  5.     mysql  :  mysql对象
  6.     host   :  要连接的主机
  7.     user   :  mysql用户,该用户必须有远程访问权限
  8.     passwd :  用户密码
  9.     db     :  要连接的数据库
  10.     port   :  端口号
  11.     unix_socket :  套接字,nullptr为默认由系统选择
  12.     clientflag  :  客户端标志,默认为0
  13. 示例:
  14. {
  15.     std::string host   = "localhost";
  16.     std::string user   = "test"; //该用户必须有远程访问权限
  17.     std::string passwd = "123";
  18.     std::string db     = "test_table";
  19.     unsigned int port   = 3306;
  20.     if(mysql_real_connect(mysql, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
  21.     {
  22.         fprintf(stderr, "%s\n", mysql_error(mysql)); //显示连接时遇到的错误
  23.         std::cerr << "Failed to connect to MySQL user!\n";
  24.         exit(-2);
  25.     }
  26.     std::cout << "Successfully to connect to MySQL user!\n";
  27. }
复制代码
  4. 设置编码格式

      
  1. //建立好链接之后,获取英文没有问题,但如果获取中文就是乱码。
  2. //设置链接的默认字符集为utf8,原始默认是latin1(拉丁文)
  3. mysql_set_character_set(myfd, "utf8");
复制代码
     5. 下发SQL语句给数据库

  
  1. 函数:
  2.     int mysql_query(MYSQL *mysql, const char *sql);
  3.     //下发SQL语句,让上面指定用户执行SQL语句对上面指定的数据库进行操作
  4. 参数:
  5.     mysql : mysql对象
  6.       sql : sql语句
  7. 返回值:
  8.     成功返回0,失败返回1。
  9. 示例:
  10.     std::string sql = "select * from test_table";
  11.     int n = mysql_query(mysql, sql.c_str());
复制代码
  6. 获取执行sql语句的结果

       sql执行完以后,如果是查询语句,我们还要读取查询出来的结果,该结果以二进制的形式被保存在mysql对象里,所以我们还需要一个函数来读取保存在mysql对象里的结果。      6.1 从myql对象里读取结果

      
  1. 函数:
  2.     MYSQL_RES *mysql_store_result(MYSQL *mysql);
  3. 参数:
  4.     mysql对象。
  5. 返回值:
  6.     MYSQL_RES对象,一个专门用来保存查询结果的对象,它有各种获取结果的方法。
  7. 说明:
  8.     对于该函数,我们需要自己创建一个MYSQL_RES指针来接收返回的MYSQL_RES对象,因为
  9. MYSQL_RES对象malloc了一片内存空间来存储查询过来的数据,所以我们一定要记得 free(),
  10. 不然会造成内存泄漏。如果用的是较新版本的devel(开发库),可能创建出来的MYSQL_RES对象
  11. 会自动释放,free会报空指针异常,就不用free。执行完mysql_store_result()以后,其实
  12. 数据都已经在MYSQL_RES对象中了,下面的api基本就是读取 MYSQL_RES对象中的数据。
  13. 示例:
  14.     MYSQL_RES* res = mysql_store_result(mysql);
  15.     if(res == nullptr) exit(0);
  16.     free(res); //如果报错证明当前版本的开发库中的mysql对象会自动释放,删除此句即可。
复制代码
   6.2 从MYSQL_RES对象里获取行数

   
  1. 函数:
  2.     my_ulonglong mysql_num_rows(MYSQL_RES *res);
  3. 参数:
  4.     MYSQL_RES对象。
  5. 返回值:
  6.     一个长整型。
  7. 示例:
  8.     int rows = mysql_num_rows(res);
  9.     std::cout << "表中有" << rows << "行。\n";
复制代码
   6.3 从MYSQL_RES对象里获取列数

   
  1. 函数:
  2.     unsigned int mysql_num_fields(MYSQL_RES *res);
  3. 参数:
  4.     MYSQL_RES对象。
  5. 返回值:
  6.     一个无符号整型。
  7. 示例:
  8.     int cols = mysql_num_fields(res);
  9.     std::cout << "表中有" << cols << "列。\n";
复制代码
   6.4 从MYSQL_RES对象里获取列名

         
  1. 函数:
  2.     MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
  3. 参数:
  4.     MYSQL_RES对象。
  5. 返回值:
  6.     MYSQL_FIELD:结构体数组指针,指向结构体数组,结构体的name成员为字符串通过用来保存列名。
  7. 示例:
  8.     int cols = mysql_num_fields(res); //获取列数
  9.     MYSQL_FIELD *col_name = mysql_fetch_fields(res);
  10.     for(int i = 0; i < cols; i++)
  11.     {
  12.         std::cout << col_name[i].name << "  |  ";
  13.     }
复制代码
   6.5 从MYSQL_RES对象里一行一行的读取结果

   
  1. 函数:
  2.     MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
  3. 参数:
  4.     MYSQL_RES对象。
  5. 返回值:
  6.     MYSQL_ROW对象,相当于一个二维数组,用来保存表中内容
  7. 示例:
  8.     MYSQL_ROW line; //创建MYSQL_ROW对象,用来保存表中内容
  9.     for(int i = 0; i < rows; i++) //行数rows通过mysql_num_rows()获取。
  10.     {
  11.         line = mysql_fetch_row(res);
  12.             
  13.         for(int j = 0; j < cols; j++) //列数cols通过mysql_num_fields()获取。
  14.         {
  15.             std::cout << line[j]<< " "; //打印第i行的第j列内容。
  16.         }
  17.         std::cout << std::endl;
  18.     }
复制代码
   

      
拓展】Connector/C库还支持事务等常用操作 

  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);
复制代码

   练习】使用Connector/C库编写一个浅易的mysql客户端

     源代码:MySQL · yblhlk/Linux课程 - 码云 - 开源中国 (gitee.com)
   
  ------------------------END-------------------------
  才疏学浅,谬误难免,接待各位品评指正。

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

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

来自云龙湖轮廓分明的月亮

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

标签云

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