1. 程式人生 > >MySQL C API 使用(基本函式)

MySQL C API 使用(基本函式)

                                                  基礎入門

一:基礎函式

A: mysql_init()——分配或初始化與mysql_real_connect()相適應的MYSQL物件。

MYSQL* mysql_init(MYSQL* mysql);

補充:如果mysql是NULL指標,該函式將分配、初始化、並返回新物件。否則,將初始化物件,並返回物件的地址。如果mysql_init()分配了新的物件,應當在程式中呼叫mysql_close() 來關閉連線,以釋放物件。

 

B: mysql_options()——用於設定額外的連線選項並影響連線的行為,可多次呼叫此函式來設定多個選項。

int mysql_options(MYSQL* mysql,enum mysql_option,const void* arg);

補充:在mysql_init()之後與mysql_real_connect()之前呼叫mysql_options()。

 

C: mysql_real_connect()——連線到MySQL server

MYSQL* mysql_real_connect(MYSQL* mysql,const char* host,const char* user,
                    const char* passwd,const char* db,unsigned int port,
                    const char* unix_socket,unsigned long client_flag)

說明:在你能夠執行需要有效MySQL連線控制代碼結構的任何其它API函式之前,mysql_real_connect() 必須成功完成。

引數:“host”——必須是主機名或IP地址。如果host是NULL或字串“localhost”,連線將被視為與本地主機連線。

           “unix_socket”——通常指定為NULL

           “client_flag”——通常為0,但是,也能將其設定為具有特定功能的標誌組合。(詳情參考:

點這裡

 

D: mysql_query()——執行以null結尾的字串指定的sql查詢語句

int mysql_query(MYSQL* mysql,const char* stmt_str)

補充:mysql_query() 不能用於執行包含二進位制資料的sql查詢語句,此時,你必須使用mysql_real_query()。

如果執行成功將返回0,如果執行錯誤,將返回非0值。

 

E: mysql_store_result()——向客戶端檢索完整的結果集

MYSQL_RES* mysql_store_result(MYSQL* mysql)

說明:在呼叫mysql_query()或者mysql_real_query() 之後,你必須呼叫mysql_store_result()或者mysql_use_result() 對於那些成功檢索了資料的每個查詢(select,show,describe,explain,check table等)。
mysql_store_result()將查詢的全部結果讀取到客戶端,分配1個MYSQL_RES結構,並將結果置於該結構中。

呼叫mysql_num_rows()可以找出結果集中的行數。可以呼叫mysql_fetch_row()來獲取結果集中的行,或呼叫mysql_row_seek()和mysql_row_tell()來獲取或設定結果集中的當前行位置。

在對結果集處理完成之後,也必須呼叫mysql_free_result()函式釋放記憶體。

 

F: mysql_use_result()——啟動逐行結果集檢索

MYSQL_RES* mysql_use_result(MYSQL* mysql)

說明:mysql_use_result() 不像mysql_store_result() 那樣將結果集實際讀取到客戶端。它必須通過對mysql_fetch_row() 的呼叫,對每一行分別進行檢索。這將直接從伺服器讀取結果,而不會將其儲存到臨時表或本地緩衝區內,與mysql_store_result() 相比,速度更快而且使用的記憶體更少。使用mysql_use_result() 時,必須執行mysql_fetch_row() ,直至返回NULL值。

 

G: mysql_fetch_row()——從結果集中獲取下一行

MYSQL_ROW mysql_fetch_row(MYSQL_RES* result)

返回值:下一行的MYSQL_ROW結構。(如果沒有更多的行可檢索或者發生錯誤時,則返回NULL)

 

H: mysql_free_result()——釋放結果集使用的記憶體

void mysql_free_result(MYSQL_RES* result)

說明:當你完成了對結果集的處理之後,你必須釋放其使用的記憶體(通過呼叫mysql_free_result() 函式)。也不要嘗試在釋放記憶體之後,去獲取結果集。

 

I: mysql_error()——返回最近呼叫MySQL函式發生的錯誤資訊

const char* mysql_error(MYSQL* mysql)

返回值:描述錯誤資訊的以null結尾的字串,如果未發生錯誤,則返回空字串。

 

M: mysql_close()——關閉一個server連線

void mysql_close(MYSQL* mysql)

說明:關閉前面已經開啟的連線。如果控制代碼是由mysql_init() 或mysql_connect() 自定分配的,mysql_close() 還將解除分配由mysql指向的連線控制代碼。 

 

二:使用範例

注:在windows系統上的Vistual Studio開發環境下需要包含標頭檔案#include <mysql.h>,並新增必要的庫檔案。在專案屬性頁介面也需要新增必要的包含目錄和庫目錄。

#include <iostream>
#include <string>

//MySQL庫(第三方庫)
#include <mysql.h>

#pragma comment(lib,"libmysql.lib")

//全域性變數宣告
MYSQL mysql;
MYSQL_RES* res;
MYSQL_ROW row;
unsigned int num_fields;

//連線資料庫
bool ConnectDatabase()
{
    //初始化資料庫
    mysql_init(&mysql);
    
    //連線到MySQL server    
    if((mysql_real_connect(&mysql,"127.0.0.1","root",
        "Admin123456","test_sql",3306,NULL,0)))
    {
        printf("Error connecting to database:%s\n",mysql_error(&mysql));
        return false;
    }
    else
    {
        printf("connected...\n");
        return true;
    }
}

//查詢資料
void QueryData(std::string& query_sql_string)
{
    const char* query_buffer=query_sql_string.c_str();

    if(mysql_query(&mysql,query_buffer)
    {
        printf("Query failed(%s)\n",mysql_error(&mysql));
    }
    else
    {
        printf("Query success\n");
        
        res=mysql_store_result(&mysql);
        num_fields=mysql_num_fields(res);
        while((row=mysql_fetch_row(res))!=NULL)
        {
            if(row[6]!=NULL)
            {
                std::string temp_string =ResultConvertToJson(row);
                ConvertUTF8ToGBK(temp_string);
                std::cout<<temp_string<<std::endl;
            }
        }
        mysql_free_result(res);    //釋放記憶體
    }
}

int main()
{
    ConnectDatabase();
    std::string query_string = "select * from test_sql.adsbtable where TargetIdentification regexp \"CCA\" and WriteTime between \"2018-12-19 11:34:46.545\" and \"2018-12-19 11:45:49.545\" and substring(PositionInWGS_84Coordinates, 11) between 101.105301 and 107.387639 and substring(PositionInWGS_84Coordinates,1,9) between 28.105045 and 33.500975";
    QueryData(query_string);
    mysql_close(&mysql);
    return 0;
}

   

三:說明

對於C++程式設計師來說,MySQL官方提供的C API(https://dev.mysql.com/doc/refman/8.0/en/c-api.html)已經能滿足大多數應用場景。

如果為了追求效率和C++特性,可以選擇基於此 C API進行再封裝的第三方庫MySQL++(https://tangentsoft.com/mysqlpp/home