MySQL学习笔记_11_Linux下C++/C连接MySQL数据库(一)



Linux 下 C++/C 连接 MySQL 数据库()



一、连接前准备

原材料:Ubuntu12.04LTS

    (已经安装了MySQL5.5或者更高级版本,新立得软件包,gcc/g++或者CodeBlosks编译器)

    安装了以上的软件包后,我们可以正常使用MySQL完成数据管理工作,但是很多时候我们需要通过编写程序访问MySQL。此时,在程序中需要加载MySQL驱动头文件,但是默认这些驱动包是没有安装的,因此我们需要在新立得中找到"libmysqld-dev"包并安装。

    安装完成之后,在”/usr/include/mysql/”目录下会有很多相对应的头文件,mysql.h等。

当写好程序,需要编译时:

    1、如果选用的是使用gcc/g++在命令行下完成,则需要加上-lmysqlclient选项。如:

  1. g++ -lmysqlclient mysql_test.cc -o mysqltest  

            2、如果选用的是CodeBlocks,则需在构建选项中,将连接库设为mysqlclient

开始编译。


二、头文件及相关函数分析

    这篇博客中所列的函数全部包含在头文件<mysql/mysql.h>下,因此,需要在程序编写开始处,加入一行:

  1. #include <mysql/mysql.h>  

1、用CAPI连接MySQL数据库有两个步骤:

    1)初始化一个连接句柄

    2)建立连接

所用到的函数如下:

  1. MYSQL *mysql_init(MYSQL *connection);               // 初始化连接句柄  
  2. //成功返回MySQL结构指针,失败返回NULL  
  3.   
  4. MYSQL *mysql_real_connect(MYSQL *connection,     
  5.                           const char *server_host,                            
  6.                           const char *sql_user_name,    
  7.                           const char *sql_password,     
  8.                           const char *db_name,     
  9.                           unsigned int port_number,     
  10.                           const char *unix_socket_name,     
  11.                           unsigned int flags);  //建立连接  
  12. //成功返回MySQL结构指针,失败返回NULL  


2MySQL连接工作完成之后,需要对MySQL的连接进行释放

  1. void mysql_close(MYSQL *connection); //关闭连接  
  2. //参数connection被清空,指针变为无效  

3mysql_options用于设置额外选项,并影响连接行为,但是它只能在mysql_initmysql_real_connect之间调用 

  1. int mysql_options(MYSQL *connection, enum mysql_option option, const char *argument);               //设置连接选项    

option的值为下列四个值之一:

  1. MYSQL_INIT_COMMAND       //连接到MySQL服务器时将执行的命令,再次连接时将自动再次执行。  
  2. MYSQL_OPT_CONNECT_TIMEOUT    //连接超时前的等待秒数  
  3. MYSQL_OPT_COMPRESS           //网络连接中使用压缩机制  
  4. MYSQL_OPT_PROTOCOL       //要使用的协议类型,影视mysql.h中定义的mysql_protocol_type枚举值之一  

4、以上的函数是在假设没有错误的情况下运行,如果数据库连接过程中出现了错误,我们就需要以下两个函数来处理错误信息:

  1. unsigned int mysql_errno(MYSQL *connection);    //返回错误代码(0表示为出现错误)    
  2. char *mysql_error(MYSQL *connection);           //返回错误信息,是以NULL作为终结的字符串   

5、程序访问数据库不只是与数据库建立连接,更重要的是通过SQL语句的执行查询或改变数据库中数据。执行SQL语句可以通过下列函数实现。

  1. int mysql_query(MYSQL *connection, const char *query);  

SQL语句分为两类,返回数据的SQL和不返回数据的SQL(UPDATEDELETEINSERT)

下面我们只介绍不返回数据的SQL

  1. my_ulonglong mysql_affected_rows(MYSQL *connection);    //返回查询受影响的行  
  2. //对一段SQL语句执行后可以通过调用此函数查看SQL语句执行后,数据库中数据状态改变的行数,以此判断SQL的执行成功与否。  

三、实例

  1. #include <iostream>  
  2. #include <fstream>  
  3. #include <cstdlib>  
  4. #include <mysql/mysql.h>  
  5.   
  6. using namespace std;  
  7.   
  8. void mysql_err_function(MYSQL * connection);  
  9.   
  10. int main()  
  11. {  
  12.     //freopen("input.txt","r",stdin);  
  13.   
  14.     MYSQL * connection;  
  15.     connection = mysql_init(NULL);  
  16.   
  17.     if (!connection)  
  18.     {  
  19.         cout << "mysql_init failed!" << endl;  
  20.   
  21.         exit(-1);  
  22.     }  
  23.   
  24.     if (!mysql_real_connect(connection,"localhost","root","123456","test",0,NULL,0))  
  25.     {  
  26.         cout << "Connection To MySQL failed!" << endl;  
  27.         mysql_err_function(connection);  
  28.     }  
  29.   
  30.     cout << "Connection To MySQL Server is Success..." << endl;  
  31.   
  32.     string str;  
  33.     getline(cin,str);  
  34.   
  35.     int res = 0;  
  36.     int affected_count = 0;  
  37.     while (str != "close" && str != "" && !res)  
  38.     {  
  39.         res = mysql_query(connection,str.c_str());  
  40.   
  41.         affected_count += mysql_affected_rows(connection);  
  42.   
  43.         if (res)  
  44.         {  
  45.             if (mysql_errno(connection))  
  46.             {  
  47.                 cout << "Error " << mysql_errno(connection) << " : "  
  48.                      << mysql_error(connection) << ‘\n‘ << endl;  
  49.                 break;  
  50.             }  
  51.         }  
  52.         getline(cin,str);  
  53.     }  
  54.   
  55.   
  56.     cout << "Have affected " << affected_count << " rows!" << endl;  
  57.   
  58.     mysql_close(connection);  
  59.     cout << "Connection To MySQL Server is closed..." << endl;  
  60.   
  61.     return 0;  
  62. }  
  63.   
  64. void mysql_err_function(MYSQL * connection)  
  65. {  
  66.     if (mysql_errno(connection))  
  67.     {  
  68.         cout << "Error " << mysql_errno(connection) << " : "  
  69.              << mysql_error(connection) << endl;  
  70.   
  71.         exit(-1);  
  72.     }  
  73. }  

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。