好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

MySQL学习笔记_13_Linux下C++/C连接MySQL数据库(三) --处理返回数据

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

-- 处理返回数据


一、通过返回结果集中的字段数

[cpp] view plaincopyprint? unsigned  int  mysql_field_count(MYSQL * connection);   //将MYSQL_ROW的值作为一个存储了一行数据的数组...   
unsigned int mysql_field_count(MYSQL * connection);
//将MYSQL_ROW的值作为一个存储了一行数据的数组...

示例:

[cpp] view plaincopyprint? //一次取一个值的情况,另一种情况与其类似,修改处会标出    #include <iostream>    #include <fstream>    #include <cstdlib>    #include <mysql/mysql.h>    using   namespace  std;      void  mysql_err_function(MYSQL * connection);   void  mysql_display(MYSQL * mysql,MYSQL_ROW sqlrow);      int  main()   {       MYSQL * connection;       connection = mysql_init(NULL);           if  (mysql_real_connect(connection, "localhost" , "root" , "123456" , "test" ,0,NULL,0))       {           cout <<  "Connection to MySQL Server is Succeed..."  << endl;           string query =  "select * from tmp15" ;            //getline(cin,query);                int  res = mysql_query(connection,query.c_str());            if  (res)           {               mysql_err_function(connection);           }            else            {               MYSQL_RES * my_res = mysql_use_result(connection);     //将mysql_use_result改为mysql_store_result即可得到另一种情况的结果(其实是相同的...)                 if  (my_res)               {                   MYSQL_ROW sqlrow;                    while  ((sqlrow = mysql_fetch_row(my_res)))                   {                       mysql_display(connection,sqlrow);                   }                      mysql_free_result(my_res);               }                else                {                   mysql_err_function(connection);               }           }              mysql_close(connection);           cout <<  "Connection to MySQL Server is Closed!"  << endl;       }        else        {           mysql_err_function(connection);       }   }      void  mysql_err_function(MYSQL * connection)   {        if  (mysql_errno(connection))       {           cout <<  "Error "  << mysql_errno(connection) <<  " : "                 << mysql_error(connection) << endl;              exit(-1);       }   }      void  mysql_display(MYSQL * mysql,MYSQL_ROW sqlrow)   {        for  (unsigned  int  i = 0; i < mysql_field_count(mysql); ++i)       {           printf( "%s " ,sqlrow[i]);            //cout << sqlrow[i] << ‘ ‘; //不知到为什么将printf换成cout之后,打印值就会出错...思考ing...        }       cout << endl;   }  
//一次取一个值的情况,另一种情况与其类似,修改处会标出
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <mysql/mysql.h>
using namespace std;

void mysql_err_function(MYSQL * connection);
void mysql_display(MYSQL * mysql,MYSQL_ROW sqlrow);

int main()
{
    MYSQL * connection;
    connection = mysql_init(NULL);

    if (mysql_real_connect(connection,"localhost","root","123456","test",0,NULL,0))
    {
        cout << "Connection to MySQL Server is Succeed..." << endl;
        string query = "select * from tmp15";
        //getline(cin,query);

        int res = mysql_query(connection,query.c_str());
        if (res)
        {
            mysql_err_function(connection);
        }
        else
        {
            MYSQL_RES * my_res = mysql_use_result(connection);	
//将mysql_use_result改为mysql_store_result即可得到另一种情况的结果(其实是相同的...)
            if (my_res)
            {
                MYSQL_ROW sqlrow;
                while ((sqlrow = mysql_fetch_row(my_res)))
                {
                    mysql_display(connection,sqlrow);
                }

                mysql_free_result(my_res);
            }
            else
            {
                mysql_err_function(connection);
            }
        }

        mysql_close(connection);
        cout << "Connection to MySQL Server is Closed!" << endl;
    }
    else
    {
        mysql_err_function(connection);
    }
}

void mysql_err_function(MYSQL * connection)
{
    if (mysql_errno(connection))
    {
        cout << "Error " << mysql_errno(connection) << " : "
             << mysql_error(connection) << endl;

        exit(-1);
    }
}

void mysql_display(MYSQL * mysql,MYSQL_ROW sqlrow)
{
    for (unsigned int i = 0; i < mysql_field_count(mysql); ++i)
    {
        printf("%s ",sqlrow[i]);
        //cout << sqlrow[i] << ' ';	//不知到为什么将printf换成cout之后,打印值就会出错...思考ing...
    }
    cout << endl;
}

二、获取一个字段的信息

[cpp] view plaincopyprint? 1、MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result);            2、MYSQL_FIELD定义:   typedef   struct  st_mysql_field   {        char  *name;                           /* Name of column */         char  *table;                           /* Table of column if column was a field */         char  *org_table;                   /* Org table name if table was an alias */         char  *db;                           /* Database for table */         char  *def;                           /* Default value (set by mysql_list_fields) */        unsigned  long  length;                   /* Width of column */        unsigned  long  max_length;           /* Max width of selected set */        unsigned  int  flags;                   /* Div flags */        unsigned  int  decimals;           /* Number of decimals in field */         enum  enum_field_types type;           /* Type of field. Se mysql_com.h for types */    } MYSQL_FIELD;          3、IS_NUM宏,若字段类型是数字形式的,则返回真。   if  (IS_NUM(mysql_field_ptr -> type))   {       cout <<  "Number"  << endl;   }      4、MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES * result,   MYSQL_FIELD_OFFSET offset);   //函数将字段光标设置到给定的偏移量offset,下一次调用mysql_fetch_field将检索与该偏移量关联的列的字段定义。如果钥定位行的开始,则要传递一个值为0的offset值。   
1、MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result);  
	
2、MYSQL_FIELD定义:
typedef struct st_mysql_field
{
    char *name;                        
/* Name of column */
    char *table;                        
/* Table of column if column was a field */
    char *org_table;                
/* Org table name if table was an alias */
    char *db;                        
/* Database for table */
    char *def;                        
/* Default value (set by mysql_list_fields) */
    unsigned long length;                
/* Width of column */
    unsigned long max_length;        
/* Max width of selected set */
    unsigned int flags;                
/* Div flags */
    unsigned int decimals;        
/* Number of decimals in field */
    enum enum_field_types type;        
/* Type of field. Se mysql_com.h for types */
} MYSQL_FIELD;
	
3、IS_NUM宏,若字段类型是数字形式的,则返回真。
if (IS_NUM(mysql_field_ptr -> type))
{
	cout << "Number" << endl;
}

4、MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES * result,
MYSQL_FIELD_OFFSET offset);
//函数将字段光标设置到给定的偏移量offset,下一次调用mysql_fetch_field将检索与该偏移量关联的列的字段定义。如果钥定位行的开始,则要传递一个值为0的offset值。

示例:

[cpp] view plaincopyprint? #include <iostream>    #include <fstream>    #include <cstdlib>    #include <mysql/mysql.h>    using   namespace  std;      void  mysql_err_function(MYSQL * connection);         //实现参照上例    void  mysql_display(MYSQL * mysql,MYSQL_ROW sqlrow);  //实现参照上例    void  mysql_display_head(MYSQL_RES * my_res);      int  main()   {       MYSQL * connection;       connection = mysql_init(NULL);           if  (mysql_real_connect(connection, "localhost" , "root" , "123456" , "test" ,0,NULL,0))       {           cout <<  "Connection to MySQL Server is Succeed..."  << endl;           string query =  "select * from tmp15" ;            //getline(cin,query);                   int  res = mysql_query(connection,query.c_str());            if  (res)           {               mysql_err_function(connection);           }            else            {               MYSQL_RES * my_res = mysql_use_result(connection);                if  (my_res)               {                   mysql_display_head(my_res);                      MYSQL_ROW sqlrow;                   cout <<  "Column Details:"  << endl;                    while  ((sqlrow = mysql_fetch_row(my_res)))                   {                       mysql_display(connection,sqlrow);                   }                      mysql_free_result(my_res);               }                else                {                   mysql_err_function(connection);               }           }              mysql_close(connection);           cout <<  "Connection to MySQL Server is Closed!"  << endl;       }        else        {           mysql_err_function(connection);       }   }      void  mysql_display_head(MYSQL_RES * my_res)   {       MYSQL_FIELD * my_field;       cout <<  "Column Describe:"  << endl;        while  ((my_field = mysql_fetch_field(my_res)))       {           cout <<  "\tName: "  << my_field -> name << endl;           cout <<  "\tType: " ;            if  (IS_NUM(my_field -> type))           {               cout <<  "Numeric field" ;           }            else            {                switch (my_field -> type)               {                case  FIELD_TYPE_VAR_STRING:                   cout <<  "Varchar" ;                    break ;                case  FIELD_TYPE_LONG:                   cout <<  "Long" ;                    break ;                default :                   cout <<  "is "  << my_field -> type <<  ",check in mysql.h" ;                    break ;               }           }           cout << endl;              cout <<  "\tMax width: "  << my_field -> length << endl;            if  (my_field -> flags & AUTO_INCREMENT_FLAG)           {               cout <<  "\tAUTO_INCREMENT"  << endl;           }           cout << endl;       }   }  

MySQL学习笔记_13_Linux下C++/C连接MySQL数据库(三) --处理返回数据

标签:c++   mysql   c api   数据处理   select   

查看更多关于MySQL学习笔记_13_Linux下C++/C连接MySQL数据库(三) --处理返回数据的详细内容...

  阅读:25次