Mysql對結果集的各種處理操作


c++操作- 查詢mysql結果集

用mysql進行數據查詢的時候,mysql會返回一個結果集給我們。接着我們需要調用mysql的api,從這個結果集中取得我們要的數據。

取完數據之后,需要釋放這個結果集。

mysql的結果集其實就是一個MYSQL_RES結構,其定義如下:

typedef struct st_mysql_res {

  my_ulonglong row_count;                              // 結果集的行數

  unsigned intfield_count, current_field;           // 結果集的列數,當前列

  MYSQL_FIELD*fields;                                   // 結果集的列信息

  MYSQL_DATA*data;                                     // 結果集的數據

  MYSQL_ROWS*data_cursor;                       // 結果集的光標

  MEM_ROOTfield_alloc;                                   // 內存結構

  MYSQL_ROWrow;                                        // 非緩沖的時候用到

  MYSQL_ROWcurrent_row;                           //mysql_store_result時會用到。當前行

  unsigned long *lengths;                               //每列的長度

  MYSQL*handle;                                          // mysql_use_result會用。

  my_booleof;                                                //是否為行尾

} MYSQL_RES;

typedef char ** MYSQL_ROW;/* 返回的每一行的值,全部用字符串來表示*/
typedef struct st_mysql_rows {
  struct st_mysql_rows *next;/* list of rows */
  MYSQL_ROW data;
}   MYSQL_ROWS;        //mysql的數據的鏈表節點。可見mysql的結果集是鏈表結構
 
typedef struct st_mysql_data {
  my_ulonglong rows;
  unsigned int fields;
  MYSQL_ROWS *data;
  MEM_ROOT alloc;
}   MYSQL_DATA; // 數據集的結構
 
typedef struct st_mysql_field {
  char *name;/* Name of column */
  char *table;                                           /* Table of column if column was a field */
  char *def;                                              /* Default value (set by mysql_list_fields) */
  enum enum_field_types type;               /* Type of field. Se mysql_com.h for types */
  unsigned int length;                              /* Width of column */
  unsigned int max_length;                      /* Max width of selected set */
  unsigned int flags;                                 /* Div flags */
  unsigned int decimals;                           /* Number of decimals in field */
}   MYSQL_FIELD;  //列信息的結構
 

typedef struct st_used_mem {/* struct for once_alloc */

  struct st_used_mem *next;/* Next block in use */

  unsigned int left;/* memory left in block  */

  unsigned int size;/* Size of block */

} USED_MEM; //內存結構

 

typedef struct st_mem_root {

  USED_MEM *free;

  USED_MEM *used;

  USED_MEM *pre_alloc;

  unsigned intmin_malloc;

  unsigned intblock_size;

  void (*error_handler)(void);

} MEM_ROOT;  //內存結構

之所以列出這些結構,是想讓大家對mysql的結果集有更清晰的認識。

以下是取得數據的相關API:

1. . mysql_store_result()

MYSQL_RES *mysql_store_result(MYSQL *mysql)

描述

對於成功檢索了數據的每個查詢(SELECTSHOWDESCRIBEEXPLAINCHECK TABLE),必須調用mysql_store_result()mysql_use_result() 

對於其他查詢,不需要調用mysql_store_result()mysql_use_result(),但是如果在任何情況下均調用了mysql_store_result()它也不會導致任何傷害或性能降低。通過檢查mysql_store_result()是否返回0,可檢測查詢是否沒有結果集(以后會更多)。

如果希望了解查詢是否應返回結果集,可使用mysql_field_count()進行檢查。請參見25.2.3.22節,“mysql_field_count()”

mysql_store_result()將查詢的全部結果讀取到客戶端,分配1MYSQL_RES結構,並將結果置於該結構中。

如果查詢未返回結果集,mysql_store_result()將返回Null指針(例如,如果查詢是INSERT語句)。

如果讀取結果集失敗,mysql_store_result()還會返回Null指針。通過檢查mysql_error()是否返回非空字符串,mysql_errno()是否返回非0值,或mysql_field_count()是否返回0,可以檢查是否出現了錯誤。

如果未返回行,將返回空的結果集。(空結果集設置不同於作為返回值的空指針)。

一旦調用了mysql_store_result()並獲得了不是Null指針的結果,可調用mysql_num_rows()來找出結果集中的行數。

可以調用mysql_fetch_row()來獲取結果集中的行,或調用mysql_row_seek()mysql_row_tell()來獲取或設置結果集中的當前行位置。

一旦完成了對結果集的操作,必須調用mysql_free_result()。

2. mysql_use_result()

MYSQL_RES *mysql_use_result(MYSQL *mysql)

描述

對於成功檢索數據的每個查詢(SELECTSHOWDESCRIBEEXPLAIN),必須用mysql_store_result()mysql_use_result()

mysql_use_result()將初始化結果集檢索,但並不像mysql_store_result()那樣將結果集實際讀取到客戶端。它必須通過對mysql_fetch_row()的調用,對每一行分別進行檢索。這將直接從服務器讀取結果,而不會將其保存在臨時表或本地緩沖區內,與mysql_store_result()相比,速度更快而且使用的內存也更少。客戶端僅為當前行和通信緩沖區分配內存,分配的內存可增加到max_allowed_packet字節。

另一方面,如果你正在客戶端一側為各行進行大量的處理操作,或者將輸出發送到了用戶可能會鍵入“^S”(停止滾動)的屏幕,就不應使用mysql_use_result()。這會綁定服務器,並阻止其他線程更新任何表(數據從這類表獲得)。

使用mysql_use_result()時,必須執行mysql_fetch_row(),直至返回NULL值,否則,未獲取的行將作為下一個檢索的一部分返回C API給出命令不同步錯誤,如果忘記了執行該操作,將不能運行該命令。

不能對結果集用mysql_data_seek()mysql_row_seek()mysql_row_tell()mysql_num_rows()mysql_affected_rows(),也不應發出其他查詢,直至mysql_use_result()完成為止。(但是,提取了所有行后,mysql_num_rows()將准確返回提取的行數)。

一旦完成了對結果集的操作,必須調用mysql_free_result()。

返回值

MYSQL_RES結果結構。如果出現錯誤,返回NULL

3.取得一行的數據:

mysql_fetch_row()

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)

描述

檢索結果集的下一行。在mysql_store_result()之后使用時,如果沒有要檢索的行,mysql_fetch_row()返回NULL

mysql_use_result()之后使用時,如果沒有要檢索的行或出現了錯誤,mysql_fetch_row()返回NULL

結果集的列數目由mysql_num_fields(result)給出。如果行中保存了調用mysql_fetch_row()返回的值,將按照row[0]row[mysql_num_fields(result)-1],訪問這些值的指針。行中的NULL值由NULL指針指明。

可以通過調用mysql_fetch_lengths()來獲得行中字段值的長度。對於空字段以及包含NULL的字段,長度為0。通過檢查字段值的指針,能夠區分它們。如果指針為NULL,字段為NULL,否則字段為空。

返回值

下一行的MYSQL_ROW結構。如果沒有更多要檢索的行或出現了錯誤,返回NULL 

示例代碼:

//假設mysql已經連接好

MYSQL_RES* result = mysql_store_result(mysql);

if (result  == NULL)

  return;

MYSQL_ROW row;
unsigned int num_fields;
unsigned int i;
num_fields = mysql_num_fields(result);
while ((row = mysql_fetch_row(result)))
{
   unsigned long *lengths;
   lengths = mysql_fetch_lengths(result);
   for(i = 0; i < num_fields; i++)
   {
       printf("[%.*s] ", (int) lengths[i], row[i] ? row[i] : "NULL");
   }
   printf("/n");
}

4. 取得列的信息。

mysql_fetch_field()

MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)

描述

返回采用MYSQL_FIELD結構的結果集的列。重復調用該函數,以檢索關於結果集中所有列的信息。未剩余字段時,mysql_fetch_field()返回NULL

每次執行新的SELECT查詢時,將復位mysql_fetch_field(),以返回關於第1個字段的信息。調用mysql_field_seek()也會影響mysql_fetch_field()返回的字段。

如果調用了mysql_query()以在表上執行SELECT但未調用mysql_store_result(),如果調用了mysql_fetch_field()以請求BLOB字段的長度,MySQL將返回默認的Blob長度(8KB)。之所以選擇8KB是因為MySQL不知道BLOB的最大長度。應在日后使其成為可配置的。一旦檢索了結果集,field->max_length將包含特定查詢中該列的最大值的長度。

返回值

當前列的MYSQL_FIELD結構。如果未剩余任何列,返回NULL

錯誤

無。

示例:

MYSQL_FIELD *field; 
while((field = mysql_fetch_field(result)))
{
    printf("field name %s/n", field->name);
}

5. 同4.

 mysql_fetch_fields()

MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)

描述

對於結果集,返回所有MYSQL_FIELD結構的數組。每個結構提供了結果集中1列的字段定義。

返回值

關於結果集所有列的MYSQL_FIELD結構的數組

示例:

unsigned int num_fields;
unsigned int i;
MYSQL_FIELD *fields;
num_fields = mysql_num_fields(result);
fields = mysql_fetch_fields(result);
for(i = 0; i < num_fields; i++)
{
   printf("Field %u is %s/n", i, fields[i].name);
}

6. 

 mysql_free_result()

void mysql_free_result(MYSQL_RES *result)

描述

釋放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等為結果集分配的內存。完成對結果集的操作后,必須調用mysql_free_result()釋放結果集使用的內存。

釋放完成后,不要嘗試訪問結果集。

返回值

無。

 

永遠記得要釋放結果集!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM