1. 程式人生 > >C語言連線mysql簡單查詢例項入門-mysql_init,mysql_real_connect,mysql_query,mysql_close等

C語言連線mysql簡單查詢例項入門-mysql_init,mysql_real_connect,mysql_query,mysql_close等

一: 分配或初始化與mysql_real_connect()相適應的MYSQL物件。用mysql_init()函式。

MYSQL *mysql_init(MYSQL *mysql) 

描述

分配或初始化與mysql_real_connect()相適應的MYSQL物件。如果mysql是NULL指標,該函式將分配、初始化、並返回新物件。否則,將初始化物件,並返回物件的地址。如果mysql_init()分配了新的物件,當呼叫mysql_close()來關閉連線時。將釋放該物件。

返回值

初始化的MYSQL*控制代碼。如果無足夠記憶體以分配新的物件,返回NULL。

錯誤

在記憶體不足的情況下,返回NULL。


二:連線資料庫引擎,通過函式mysql_real_connect()嘗試與執行在主機上的MySQL資料庫引擎建立連線。

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_real_connect()嘗試與執行在主機上的MySQL資料庫引擎建立連線。在你能夠執行需要有效MySQL連線控制代碼結構的任何其他API函式之前,mysql_real_connect()必須成功完成。

引數的指定方式如下:

·         第1個引數應是已有MYSQL結構的地址。呼叫mysql_real_connect()之前,必須呼叫mysql_init()來初始化MYSQL結構。通過mysql_options()呼叫,可更改多種連線選項。請參見25.2.3.48節,“mysql_options()”。

·         “host”的值必須是主機名或IP地址。如果“host”是NULL或字串"localhost",連線將被視為與本地主機的連線。如果作業系統支援套接字(Unix)或命名管道(Windows),將使用它們而不是TCP/IP連線到伺服器。

·         “user”引數包含使用者的MySQL登入ID。如果“user”是NULL或空字串"",使用者將被視為當前使用者。在UNIX環境下,它是當前的登入名。在Windows ODBC下,必須明確指定當前使用者名稱。請參見26.1.9.2節,“在Windows上配置MyODBC DSN”。

·         “passwd”引數包含使用者的密碼。如果“passwd”是NULL,僅會對該使用者的(擁有1個空密碼欄位的)使用者表中的條目進行匹配檢查。這樣,資料庫管理員就能按特定的方式設定MySQL許可權系統,根據使用者是否擁有指定的密碼,使用者將獲得不同的許可權。

註釋:呼叫mysql_real_connect()之前,不要嘗試加密密碼,密碼加密將由客戶端API自動處理。

·         “db”是資料庫名稱。如果db為NULL,連線會將預設的資料庫設為該值。

·         如果“port”不是0,其值將用作TCP/IP連線的埠號。注意,“host”引數決定了連線的型別。

·         如果unix_socket不是NULL,該字串描述了應使用的套接字或命名管道。注意,“host”引數決定了連線的型別。

·         client_flag的值通常為0,但是,也能將其設定為下述標誌的組合,以允許特定功能:

標誌名稱

標誌描述

CLIENT_COMPRESS

使用壓縮協議。

CLIENT_FOUND_ROWS

返回發現的行數(匹配的),而不是受影響的行數。

CLIENT_IGNORE_SPACE

允許在函式名後使用空格。使所有的函式名成為保留字。

CLIENT_INTERACTIVE

關閉連線之前,允許interactive_timeout(取代了wait_timeout)秒的不活動時間。客戶端的會話wait_timeout變數被設為會話interactive_timeout變數的值。

CLIENT_LOCAL_FILES

允許LOAD DATA LOCAL處理功能。

CLIENT_MULTI_STATEMENTS

通知伺服器,客戶端可能在單個字串內傳送多條語句(由‘;’隔開)。如果未設定該標誌,將禁止多語句執行。

CLIENT_MULTI_RESULTS

通知伺服器,客戶端能夠處理來自多語句執行或儲存程式的多個結果集。如果設定了CLIENT_MULTI_STATEMENTS,將自動設定它。

CLIENT_NO_SCHEMA

禁止db_name.tbl_name.col_name語法。它用於ODBC。如果使用了該語法,它會使分析程式生成錯誤,在捕獲某些ODBC程式中的缺陷時,它很有用。

CLIENT_ODBC

客戶端是ODBC客戶端。它將mysqld變得更為ODBC友好。

CLIENT_SSL

使用SSL(加密協議)。該選項不應由應用程式設定,它是在客戶端庫內部設定的。


返回值
如果連線成功,返回MYSQL*連線控制代碼。如果連線失敗,返回NULL。對於成功的連線,返回值與第1個引數的值相同。

三:查詢資料庫中的某一個表內容,通過函式mysql_query()來實現。

本例呼叫為:mysql_query(connect, "select * from dept);

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

描述

執行由“Null終結的字串”查詢指向的SQL查詢。正常情況下,字串必須包含1條SQL語句,而且不應為語句新增終結分號(‘;’)或“\g”。如果允許多語句執行,字串可包含多條由分號隔開的語句。請參見25.2.9節,“多查詢執行的C API處理”。

mysql_query()不能用於包含二進位制資料的查詢,應使用mysql_real_query()取而代之(二進位制資料可能包含字元‘\0’,mysql_query()會將該字元解釋為查詢字串結束)。

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

返回值

如果查詢成功,返回0。如果出現錯誤,返回非0值。

查詢的結果需要mysql_store_result來獲取。查詢的結果通過結構體mysql關聯。

四:顯示查詢資料庫中資料表的內容,mysql_store_result()將mysql_query()查詢的全部結果讀取到客戶端,分配1個MYSQL_RES結構,並將結果置於該結構中。

此時應該注意,查詢的結果有可能是多行。

應該呼叫函式mysql_field_count()返回表的列數。

可以呼叫函式mysql_fetch_row()來獲取多行結果的一行內容。

可以通過函式mysql_fetch_fields()來獲取表頭的內容。

MYSQL_RES *mysql_store_result(MYSQL *mysql) 

描述

對於成功檢索了資料的每個查詢(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK 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()將查詢的全部結果讀取到客戶端,分配1個MYSQL_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()。

請參見25.2.13.1節,“為什麼在mysql_query()返回成功後,mysql_store_result()有時會返回NULL”. 

返回值

具有多個結果的MYSQL_RES結果集合。如果出現錯誤,返回NULL。

mysql_field_count()簡介:

unsigned int mysql_field_count(MYSQL *mysql) 

描述

返回作用在連線上的最近查詢的列數。

該函式的正常使用是在mysql_store_result()返回NULL(因而沒有結果集指標)時。在這種情況下,可呼叫mysql_field_count()來判定mysql_store_result()是否應生成非空結果。這樣,客戶端就能採取恰當的動作,而無需知道查詢是否是SELECT(或類似SELECT的)語句。在這裡給出的示例中,演示了完成它的方法。

請參見25.2.13.1節,“為什麼在mysql_query()返回成功後,mysql_store_result()有時會返回NULL”. 

返回值

表示結果集中列數的無符號整數。

錯誤

無。

mysql_fetch_row()簡介:

MYSQL_ROW 是char ** 型別;
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_fetch_row()的兩次呼叫之間,不會復位錯誤。

·         CR_SERVER_LOST 

在查詢過程中,與伺服器的連線丟失。 

·         CR_UNKNOWN_ERROR 

出現未知錯誤。 

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


五:釋放記憶體,釋放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等為結果集分配的記憶體。

void mysql_free_result(MYSQL_RES *result) 

描述

釋放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等為結果集分配的記憶體。完成對結果集的操作後,必須呼叫mysql_free_result()釋放結果集使用的記憶體。

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

返回值

無。

錯誤

無。

六:關閉前面開啟的mysql連線。

void mysql_close(MYSQL *mysql) 

描述

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

返回值

無。

錯誤

無。


通過mysql客戶端來查詢資料庫test中表department的內容:

 select * from department;

通過C語言程式呼叫Mysql的API函式來查詢資料庫test中表department的內容:

原始碼:

/*************************************************************************
	> File Name:mysql_test.c 
	> Author: 
	> Mail: 
	> Created Time: 2016年02月11日 星期四 10時45分31秒
 ************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h>

int main()
{
    int ret = 0;

    MYSQL mysql;
    MYSQL * connect = NULL;
    connect = mysql_init(&mysql);
    if(connect == NULL){
        ret = mysql_errno(&mysql);
        printf("mysql_init error, %s\n", mysql_error(&mysql));
        return ret;
    }
    printf("mysql_init ok...\n");


    //connect = mysql_real_connect(connect, NULL, "root", "yxk", "mydb61", 0, NULL, 0);
    connect = mysql_real_connect(connect, "localhost", "root", "yxk", "test", 0, NULL, 0);
    if(connect == NULL){
        ret = mysql_errno(&mysql);
        printf("mysql_real_connect error, err is: %s\n", mysql_error(&mysql));
        return ret;
    }
    
    printf("mysql_real_connect ok...\n");

    const char * query = "select * from department";
    ret = mysql_query(connect, query);
    if(ret != 0){
        printf("mysql_query error\n");
        return ret;
    }

    MYSQL_RES *result = mysql_store_result(&mysql);
    if(result == NULL){
        printf("mysql_store_result error\n");
        return -1;
    }
    
    int field_num = mysql_field_count(&mysql);
    //表頭
    MYSQL_FIELD * fields = mysql_fetch_fields(result);
    int i = 0;

    printf("------------------------------------------\n");
    for(i= 0; i < field_num; i++){
        printf("%s \t", fields[i].name); 
    }
    printf("\n------------------------------------------\n");


    //表內容
    MYSQL_ROW row = NULL;
    while(row = mysql_fetch_row(result)){
        for(i= 0; i < field_num; i++){
            printf("%s \t", row[i]); 
        }
        printf("\n");
    }

    mysql_free_result(result);//釋放記憶體

    mysql_close(connect);

    printf("mysql_close...\n");

    return ret;
}


Makefile檔案:

mysql_test:mysql_test.c
	gcc mysql_test.c -o mysql_test -I/usr/include/ -L/usr/lib/x86_64-linux-gnu/ -lmysqlclient
clean:
	rm mysql_test 

執行輸出結果: