MYSQL C API : CLIENT_MULTI_STATEMENTS 选项

  1 #include <iostream>
  2 #include <mysql.h>
  3 #include <string>
  4 
  5 #include <assert.h>
  6 
  7 
  8 
  9 int main()
 10 {
 11     MYSQL *ms_conn = mysql_init(NULL);
 12     if (ms_conn == NULL)
 13     {
 14         std::cout << "Error: mysql_init failed." << std::endl;
 15         return 0;
 16     }
 17     std::cout << "Info: mysql_init success." << std::endl;
 18 
 19     // 参数CLIENT_MULTI_STATEMENTS 指定一次query 可以执行多条SQL
 20     MYSQL *ms_temp = NULL;
 21     ms_temp = mysql_real_connect(ms_conn, "localhost", "root", "123456sx", 
 22             "suyh", 0, NULL, CLIENT_MULTI_STATEMENTS);
 23     if (ms_temp == NULL)
 24     {
 25         std::cout << "Error: mysql_real_connect() failed." << std::endl;
 26         std::cout << mysql_error(ms_conn) << std::endl;
 27         mysql_close(ms_conn), ms_conn = NULL;
 28         return 0;
 29     }
 30     std::cout << "Info: mysql_real_connect() succect." << std::endl;
 31 
 32     std::string str_sqls = "";
 33     str_sqls += "SELECT id, account, sex, level, powers FROM player_data WHERE id = 100000";
 34     str_sqls += ";";
 35     str_sqls += "SELECT id, account, sex, level, powers FROM player_data WHERE id = 100001";
 36     str_sqls += ";";
 37     str_sqls += "SELECT id, account, sex, level, powers FROM player_data WHERE id = 100002";
 38 
 39     int res = 0;
 40     res = mysql_real_query(ms_conn, str_sqls.c_str(), str_sqls.size());
 41     if (res != 0)
 42     {
 43         std::cout << "Info: query failed, sql: " << str_sqls.c_str() << std::endl;
 44         std::cout << mysql_error(ms_conn) << std::endl;
 45     }
 46     else
 47     {
 48         std::cout << "Info: query success." << std::endl;
 49         std::cout << std::endl;
 50 
 51         // CLIENT_MULTI_STATEMENTS 指定该选项需要mysql_next_result() 函数来获取下一条结果集
 52         // 如果结果集未取完,则不能进行query 操作。
 53         do
 54         {
 55             MYSQL_RES *ms_res = mysql_store_result(ms_conn);
 56             assert(ms_res != NULL);
 57 
 58             unsigned int field_num = mysql_num_fields(ms_res);
 59             std::cout << "fileds number is " << field_num << std::endl;
 60 
 61             MYSQL_FIELD* field_info = mysql_fetch_field(ms_res);
 62             assert(field_info != NULL);
 63 
 64             MYSQL_ROW row_data = NULL;
 65             while (1)
 66             {
 67                 row_data = mysql_fetch_row(ms_res);
 68                 if (row_data == NULL)
 69                     break;
 70 
 71                 unsigned long *field_lens = mysql_fetch_lengths(ms_res);
 72                 assert(field_lens != NULL);
 73                 for (int i = 0; i < field_num; ++i)
 74                 {
 75                     if (field_info[i].type == MYSQL_TYPE_BLOB)
 76                     {
 77                         std::cout << "current filed type is BLOB." << std::endl;
 78                         continue;
 79                     }
 80 
 81                     if (row_data[i] == NULL)
 82                     {
 83                         std::cout << "field_lens[" << i << "] = " << field_lens[i]
 84                             << ", value is NULL." << std::endl;
 85                     }
 86                     else
 87                     {
 88                         std::cout << "field_lens[" << i << "] = " << field_lens[i] 
 89                             << ", value is " << row_data[i] << std::endl;
 90                     }
 91                 }
 92             }
 93 
 94             mysql_free_result(ms_res), ms_res = NULL;
 95 
 96             std::cout << "#######################################" << std::endl;
 97         } while (mysql_next_result(ms_conn) == 0);
 98     }
 99 
100 
101 
102     mysql_close(ms_conn), ms_conn = NULL;
103     return 0;
104 }