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; }}