MySQL学习笔记_13_Linux下C++/C连接MySQL数据库(三) --处理返回数据
Linux下C++/C连接MySQL数据库(三)
--处理返回数据
一、通过返回结果集中的字段数
- unsigned int mysql_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;
- }
- }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。