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,可是,也能將其設置爲下述標誌的組合,以容許特定功能:

標誌名稱mysql

標誌描述linux

CLIENT_COMPRESSsql

使用壓縮協議。數據庫

CLIENT_FOUND_ROWS數組

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

CLIENT_IGNORE_SPACEsocket

容許在函數名後使用空格。使全部的函數名成爲保留字。函數

CLIENT_INTERACTIVE性能

關閉鏈接以前,容許interactive_timeout(取代了wait_timeout)秒的不活動時間。客戶端的會話wait_timeout變量被設爲會話interactive_timeout變量的值。fetch

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()來實現。

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


運行輸出結果:

相關文章
相關標籤/搜索