【Linux】嵌入式C語言MySQL編程(libmysqlclient-dev使用)

準備工作

  • 搜索是否包含依賴庫
sudo apt-cache search mysqlclient-dev

(顯然打錯了,是libmysqlclient-dev庫)
在這裏插入圖片描述

  • 安裝依賴庫
sudo apt install libmysqlclient-dev
  • 查看是否已經安裝
sudo apt list --installed |grep libmysqlclient-dev

在這裏插入圖片描述

  • 查看頭文件是否已經包含
find /usr|grep mysql.h

在這裏插入圖片描述

相關函數解釋

C變量類型

MYSQL
表示對一個數據庫的連接句柄;
MYSQL_RES
代表返回行的一個查詢的(SELECT, SHOW, DESCRIBE, EXPLAIN)的結果。返回的數據稱爲“數據集”,用過數據庫的應該對數據庫中查詢後得到的結果集不會陌生,在C的API裏對應的就是MYSQL_RES了,從數據庫讀取數據,最後就是從MYSQL_RES中讀取數據。
MYSQL_ROW
這是一個行數據的類型安全(type-safe)的表示。當前它實現爲一個計數字節的字符串數組。(如果字段值可能包含二進制數據,你不能將這些視爲空終止串,因爲這樣的值可以在內部包含空字節) 行通過調用mysql_fetch_row()獲得。
MYSQL_FIELD
這個結構包含字段信息,例如字段名、類型和大小。其成員在下面更詳細地描述。你可以通過重複調用mysql_fetch_field()對每一列獲得MYSQL_FIELD結構。字段值不是這個結構的部分;他們被包含在一個MYSQL_ROW結構中。
MYSQL
表示對一個數據庫的連接句柄;
MYSQL_RES
個結構代表返回行的一個查詢的(SELECT, SHOW, DESCRIBE, EXPLAIN)的結果。返回的數據稱爲“數據集”,用過數據庫的應該對數據庫中查詢後得到的結果集不會陌生,在C的API裏對應的就是MYSQL_RES了,從數據庫讀取數據,最後就是從MYSQL_RES中讀取數據。
MYSQL_ROW
這是一個行數據的類型安全(type-safe)的表示。當前它實現爲一個計數字節的字符串數組。(如果字段值可能包含二進制數據,你不能將這些視爲空終止串,因爲這樣的值可以在內部包含空字節) 行通過調用mysql_fetch_row()獲得。
MYSQL_FIELD
這個結構包含字段信息,例如字段名、類型和大小。其成員在下面更詳細地描述。你可以通過重複調用mysql_fetch_field()對每一列獲得MYSQL_FIELD結構。字段值不是這個結構的部分;他們被包含在一個MYSQL_ROW結構中。
my_ulonglong
該類型用於行編號和mysql_affected_rows()、mysql_num_rows()和mysql_insert_id()。
該類型用於行編號和mysql_affected_rows()、mysql_num_rows()和mysql_insert_id()。

C語言常用開發接口

mysql_init

原型:MYSQL *mysql_init(MYSQL *mysql)
mysql_init的作用是初始化MYSQL變量,爲mysql_real_connect()做準備。
返回值:MYSQL句柄或描述符;內存不足是爲NULL;
在這裏插入圖片描述

mysql_real_connect

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 int client_flag)
說明:
如果port!=0, 則將作爲TCP/IP端口使用,爲0則使用 表示使用默認端口號3306;
如果unix_socket!=NULL,則可指定socket或命名PIPE,默認爲NULL;
client_flag可以指定特定的值(略),默認爲0.

mysql_query

功能:執行sql命令 原型: int mysql_query(MYSQL *mysql, const char *query) 說明:
query爲數據庫操作命令字符串,本義是查詢(select),可包括select,update,insert,delete等對數據庫操作的命令。
返回值:0表示正常,非0表示發生了錯誤。
在這裏插入圖片描述
說明:

  • sprintf:將指令寫入緩衝區,動態生成字符串
  • 使用前需要先定義一個緩衝區的數組sqlcommand[]

mysql_store_result

功能:結果集處理。如果使用mysql_query運行的是一個SELECT語句,或其它可以返回結果的查詢,可用函數mysql_store_result來訪問返回結果並將其保存在一個變量中,以便做進一步處理。
用法:
MYSQL_RES *mysql_store_result(MYSQL *mysql)
MYSQL_RES *mysql_use_result(MYSQL *mysql)
在這裏插入圖片描述
說明:
mysql爲mysql_real_connect函數的返回值。
使用了mysql_store_result函數保存結果後,可以使用以下函數對結果集進行處理。

  • 獲得結果集中的行數: my_ulonglong mysql_num_rows(MYSQL_RES *result)
  • 讀取結果集中的一行: MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)

mysql_fetch_row

獲得結果集中的域的屬性:
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)
獲得域屬性數組:
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)
查詢被update、delete、insert等受影響的行:
my_ulonglong mysql_affected_rows(MYSQL *mysql)
在這裏插入圖片描述

mysql_free_result和mysql_close

當對數據庫使用完畢後,應對所創建的變量等進行釋放:
mysql_free_result(result);
mysql_close(&mysql);

錯誤處理

  • 利用函數的返回值來判斷函數執行是否正確。
  • 使用mysql提供的錯誤號和錯誤信息:
  1. 錯誤號: unsigned int mysql_errno(MYSQL *mysql)
  2. 錯誤信息: char *mysql_error(MYSQL *mysql)

一些輔助函數

獲取客戶機版本信息:
char *mysql_get_client_info(void)
獲取主機信息:
char *mysql_get_host_info(MYSQL *mysql)
獲取協議版本信息:
unsigned int mysql_get_proto_info(MYSQL *mysql)
獲取服務器版本信息:
char *mysql_get_server_info(MYSQL *mysql)
獲取可用數據庫列表:
MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild)
獲取數據庫的可有表列表
MYSQL_RES *mysql_list_tables(MYSQL *mysql, const char *wild)

實踐一下

完整代碼

#include <stdio.h>
#include <string.h>
#include <mysql/mysql.h>
int main(void)
{
    MYSQL com_mysql;//聲明一個數據庫連接句柄
    char sqlcommand[100];
    MYSQL_RES *pRes;
    MYSQL_ROW hs;
    if(mysql_init(&com_mysql)==NULL)//使用指針尋址,要用到&
    {
            printf("Cannot init mysql!\n");
            return 0;
    }
    if(mysql_real_connect(&com_mysql,"【域名或者主機ip】","【用戶名】","【密碼】","【數據庫名稱】",0,NULL,0)==NULL)//相對應替換自己的ip、用戶名、密碼、數據庫
    {
        printf("%s\n",mysql_error(&com_mysql));
        return 0;
    }
    sprintf(sqlcommand,"select *  from student");//寫入緩存區,換成自己的表名,這裏使用的是student
    if(mysql_query(&com_mysql,sqlcommand)!=0)
    {
        printf("%s\n",mysql_error(&com_mysql));
        return 0;
    }
    if((pRes=mysql_store_result(&com_mysql))==NULL)
    {
        printf("%s\n",mysql_error(&com_mysql));
        return 0;
    }
    while(hs=mysql_fetch_row(pRes))
    {
        //printf("id=%d,age=%d,name=%s\n",hs[0],hs[1],hs[2]);//錯:因爲mysql_fetch_row已經把字段值轉換爲字符串了
        printf("id=%s,age=%s,name=%s\n",hs[0],hs[1],hs[2]);
    }
    mysql_free_result(pRes);
    mysql_close(&com_mysql);//善後處理
    return 0;
}

編譯:gcc -o mysql mysql.c -lmysqlclient
因爲libmysqlclient-dev是第三方庫,結尾要加入 -lmysqlclient

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章