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

页面导航:首页 > 数据库 > Mysql > MySQL学习笔记_13_Linux下C++/C连接MySQL数据库(三)--处

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

来源: 作者: 时间:2016-01-30 09:02 【

Linux下C 43; 43; C连接MySQL数据库(三)--处理返回数据一、通过返回结果集中的字段数unsigned int mysql_field_count(MYSQL * connection); 将MYSQL_ROW的值作为一个存储了一行数据的数组 示例:

Linux下C++/C连接MySQL(三)

--处理返回数据

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

unsigned int _field_count(MYSQL * connection);
//将MYSQL_ROW的值作为一个存储了一行数据的数组...

示例:

//一次取一个值的情况,另一种情况与其类似,修改处会标出
#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;
}

二、获取一个字段的信息

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值。

示例:

#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;
    }
}
Tags:

文章评论

最 近 更 新
热 点 排 行
Js与CSS工具
代码转换工具

<