MYSQL C API : mysql_real_query()

 

 1 enum enum_field_types { 
 2     MYSQL_TYPE_DECIMAL, 
 3     MYSQL_TYPE_TINY,
 4     MYSQL_TYPE_SHORT,  
 5     MYSQL_TYPE_LONG,
 6     MYSQL_TYPE_FLOAT,  
 7     MYSQL_TYPE_DOUBLE,
 8     MYSQL_TYPE_NULL,   
 9     MYSQL_TYPE_TIMESTAMP,
10     MYSQL_TYPE_LONGLONG,
11     MYSQL_TYPE_INT24,
12     MYSQL_TYPE_DATE,   
13     MYSQL_TYPE_TIME,
14     MYSQL_TYPE_DATETIME, 
15     MYSQL_TYPE_YEAR,
16     MYSQL_TYPE_NEWDATE, 
17     MYSQL_TYPE_VARCHAR,
18     MYSQL_TYPE_BIT,
19     MYSQL_TYPE_TIMESTAMP2,
20     MYSQL_TYPE_DATETIME2,
21     MYSQL_TYPE_TIME2,
22     MYSQL_TYPE_NEWDECIMAL=246,
23     MYSQL_TYPE_ENUM=247,
24     MYSQL_TYPE_SET=248,
25     MYSQL_TYPE_TINY_BLOB=249,
26     MYSQL_TYPE_MEDIUM_BLOB=250,
27     MYSQL_TYPE_LONG_BLOB=251,
28     MYSQL_TYPE_BLOB=252,
29     MYSQL_TYPE_VAR_STRING=253,
30     MYSQL_TYPE_STRING=254,
31     MYSQL_TYPE_GEOMETRY=255
32 }
33 
34 typedef struct st_mysql_field {
35   char *name;                 /* Name of column 列名 */
36   char *org_name;             /* Original column name, if an alias */
37   char *table;                /* Table of column if column was a field */
38   char *org_table;            /* Org table name, if table was an alias */
39   char *db;                   /* Database for table */
40   char *catalog;           /* Catalog for table */
41   char *def;                  /* Default value (set by mysql_list_fields) */
42   unsigned long length;       /* Width of column (create length) */
43   unsigned long max_length;   /* Max width for selected set */
44   unsigned int name_length;
45   unsigned int org_name_length;
46   unsigned int table_length;
47   unsigned int org_table_length;
48   unsigned int db_length;
49   unsigned int catalog_length;
50   unsigned int def_length;
51   unsigned int flags;         /* Div flags */
52   unsigned int decimals;      /* Number of decimals in field */
53   unsigned int charsetnr;     /* Character set */
54   enum enum_field_types type; /* Type of field. See mysql_com.h for types */   // 字段的mysql 数据类型
55   void *extension;
56 } MYSQL_FIELD;
57 
58 
59 int    mysql_real_query(MYSQL *mysql, const char *q, unsigned long length);
60     说明:执行SQL
61     参数1:已初始化的MYSQL 实例;
62     参数2:SQL 语句;
63     参数3:SQL 语句字符数。
64 
65 MYSQL_RES *mysql_store_result(MYSQL *mysql);
66     说明:对于成功检索了数据的每个查询(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),必须调用mysql_store_result()或mysql_use_result()
67     参数:已初始化的MYSQL 实例。
68 
69 // typedef char **MYSQL_ROW; 
70 MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
71     说明:检索一个结果集合的下一行。当在mysql_store_result()之后使用时,如果没有更多的行可检索时,mysql_fetch_row()返回NULL。当在mysql_use_result()之后使用时,当没有更多的行可检索时或如果出现一个错误,mysql_fetch_row()返回NULL。

 

代码范例:

 1 #include <iostream>
 2 #include <mysql.h>
 3 #include <string>
 4 
 5 #include <assert.h>
 6 
 7 int main()
 8 {
 9     // 1、初始化MYSQL 实例
10     MYSQL *ms_conn = mysql_init(NULL);
11     if (ms_conn == NULL)
12     {
13         std::cout << "Error: mysql_init failed." << std::endl;
14         return 0;
15     }
16     std::cout << "Info: mysql init successful." << std::endl;
17 
18     // 2、连接MYSQL 服务器
19     MYSQL *ms_tmp_res = NULL;
20     ms_tmp_res = mysql_real_connect(ms_conn, "localhost", "root", "123456sx", 
21             "suyh", 0, NULL, 0);
22     if (ms_tmp_res == NULL)
23     {
24         std::cout << "Error: connect mysql failed: " << mysql_error(ms_conn) << std::endl;
25         mysql_close(ms_conn), ms_conn = NULL;
26         return 0;
27     }
28     std::cout << "Info: mysql connect successful." << std::endl;
29 
30     // 3、执行SQL 语句
31     std::string str_sqls = "";
32     str_sqls += "SELECT id, account, sex, level, powers FROM player_data WHERE id = 100000 OR id = 100001 OR id = 100002";
33 
34     int res = 0;
35     res = mysql_real_query(ms_conn, str_sqls.c_str(), str_sqls.size());
36     if (res != 0)
37     {
38         std::cout << "Error: query failed, sql: " << str_sqls.c_str() << std::endl;
39         std::cout << mysql_error(ms_conn) << std::endl;
40     }
41     else
42     {
43         std::cout << "Info: query successful." << std::endl;
44 
45         // 取出SQL 语句执行的结果集
46         MYSQL_RES *ms_res = mysql_store_result(ms_conn);
47         if (ms_res != NULL)
48         {
49             // 字段个数
50             unsigned int field_num = mysql_num_fields(ms_res);
51 
52             // 每个字段的数据信息
53             MYSQL_FIELD* field_info = mysql_fetch_field(ms_res);
54             assert(field_info != NULL);
55 
56             // 每一个字段的值存储在row_data[i] 中,基本都以字符串的形式存储。NULL 的结果 指针也是NULL。
57             // 二进制数据可以通过mysql_fetch_lengths() 函数得到该字段的二进制数据长度,同样以数组形式取出,即:lens[i];
58             MYSQL_ROW row_data = NULL;    // mysql.h    ---    typedef char **MYSQL_ROW;
59             while (1)
60             {
61                 row_data = mysql_fetch_row(ms_res);    // 取出下一行结果
62                 if (row_data == NULL)
63                     break;
64 
65                 std::cout << "##############################################" << std::endl;
66                 for (int i = 0; i < field_num; ++i)
67                 {
68                     if (row_data[i] == NULL)
69                         std::cout << "field name: '" << field_info[i].name << "', values is NULL." << std::endl;
70                     else
71                         std::cout << "field name: '" << field_info[i].name << "', values is " << row_data[i] << std::endl;
72                 }
73             }
74         }
75 
76         // 释放结果集
77         mysql_free_result(ms_res), ms_res = NULL;
78     }
79 
80     // 使用完释放系统资源
81     mysql_close(ms_conn), ms_conn = NULL;
82     
83     return 0;
84 }

 

posted on 2015-09-07 15:16  独孤酷酷  阅读(4293)  评论(1编辑  收藏  举报