C語言操作MYSQL資料庫

來源:互聯網
上載者:User

標籤:

目錄

1、MYSQL資料結構

2、MYSQL常用函數

3、MYSQL操作流程

4、執行個體

MySQL是一個開源碼的小型關聯式資料庫管理系統,體積小,速度快,總體成本低,開源。MySQL有以下特性:

(1) 使用C和C++編寫,並使用了多種編譯器進行測試,保證源碼的可移植性。

(2) 支援多線程,利用CPU資源,支援多使用者。

(3) 可以處理擁有上千萬條記錄的大型資料庫。

(4)既可以作為一個單獨的應用程式應用在用戶端伺服器網路環境中,也能夠作為 一個庫而嵌入到其他軟體中去。

 

1、MYSQL資料結構

介紹常用到的MYSQL相關的C變數類型。這些類型在我們後面定義變數的時候會用到

1、MYSQL

       要串連MYSQL,必須建立MYSQL執行個體,通過mysql_init初始化方能開始進行串連

樣本:

MYSQL mysql;                    #建立MYSQL執行個體

mysql_init(&mysql);             #初始化開始進行串連

2、MYSQL_RES

這個結構代表返回行的一個查詢的(SELECT, SHOW, DESCRIBE, EXPLAIN)的結果。返回的資料稱為“資料集”。 從資料庫讀取資料,最後就是從MYSQL_RES中讀取資料。

PS:類似於JAVA裡面的ResultSet變數一樣,將結果集存入到此變數中再從它裡面去讀資料。

3、MYSQL_ROW

這是一個行資料的型別安全(type-safe)的表示。當前它實現為一個計數位元組的字串數組。行通過調用mysql_fetch_row()獲得

4、MYSQL_FIELD

你可以通過重複調用mysql_fetch_field()對每一列獲得MYSQL_FIELD結構。這個結構包含欄位資訊,例如欄位名、類型和大小。

PS:此變數定義的是列的相關屬性問題!

以下代碼塊是用來串連資料庫的通訊過程,要串連MYSQL,必須建立MYSQL執行個體,通過mysql_init初始化方能開始進行串連.

typedef struct st_mysql {
 NET           net;            /* Communication parameters */
 gptr          connector_fd;   /* ConnectorFd for SSL */
 char          *host,*user,*passwd,*unix_socket,
                *server_version,*host_info,*info,*db;
 unsigned int port,client_flag,server_capabilities;
 unsigned int protocol_version;
 unsigned int field_count;
 unsigned int server_status;
 unsigned long thread_id;      /* Id for connection in server */
 my_ulonglong affected_rows;
 my_ulonglong insert_id;       /* id if insert on table with NEXTNR */
 my_ulonglong extra_info;              /* Used by mysqlshow */
 unsigned long packet_length;
 enum mysql_status status;
 MYSQL_FIELD   *fields;
 MEM_ROOT      field_alloc;
 my_bool       free_me;        /* If free in mysql_close */
 my_bool       reconnect;      /* set to 1 if automatic reconnect */
 struct st_mysql_options options;
 char          scramble_buff[9];
 struct charset_info_st *charset;
 unsigned int server_language;
} MYSQL;


這個結構代表返回行的一個查詢的(SELECTSHOWDESCRIBEEXPLAIN)的結果。返回的資料稱為“資料集”,用過資料庫的朋友應該對資料庫中查詢後得到的結果集不會陌生,在C的API裡對應的就是MYSQL_RES了,從資料庫讀取資料,最後就是從MYSQL_RES中讀取資料。

typedef struct st_mysql_res {
 my_ulonglong row_count;
 unsigned int field_count, current_field;
 MYSQL_FIELD   *fields;
 MYSQL_DATA    *data;
 MYSQL_ROWS    *data_cursor;
 MEM_ROOT      field_alloc;
 MYSQL_ROW     row;            /* If unbuffered read */
 MYSQL_ROW     current_row;    /* buffer to current row */
 unsigned long *lengths;       /* column lengths of current row */
 MYSQL         *handle;        /* for unbuffered reads */
 my_bool       eof;            /* Used my mysql_fetch_row */
} MYSQL_RES;

 

 

2、MYSQL常用函數

 

所需標頭檔: #include <mysql/mysql.h>
功能:  獲得或初始化一個MYSQL結構
函數原型: MYSQL *mysql_init(MYSQL *mysql)
函數傳回值: 一個被始化的MYSQL*控制代碼
備忘:  在記憶體不足的情況下,返回NULL

 

所需標頭檔: #include <mysql/mysql.h>
函數功能: 關閉一個伺服器串連,並釋放與串連相關的記憶體
函數原型: void mysql_close(MYSQL *mysql);
函數傳入值: MYSQL:類型的指標
函數傳回值: 無

 

所需標頭檔: #include <mysql/mysql.h>
函數功能: 串連一個MySQL伺服器
函數原型: MYSQL * mysql_connect(MYSQL *mysql,const char *host,const char *user,const char *passwd);
函數傳入值: mysql表示一個現存mysql結構的地址
  host表示MYSQL伺服器的主機名稱或IP
  user表示登入的使用者名稱
  passwd表示登入的密碼
函數傳回值: 如果串連成功,一個MYSQL *串連控制代碼:如果串連失敗,NULL
備忘:  該函數不推薦,使用mysql_real_connect()代替

 

所需檔案: #include <mysql/mysql.h>
函數功能: 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);
函數傳入值: mysql表示一個現存mysql結構的地址
  host表示MYSQL伺服器的主機名稱或IP
  user表示登入的使用者名稱
  passwd表示登入的密碼
  db表示要串連的資料庫
  port表示MySQL伺服器的TCP/IP連接埠
  unix_socket表示連線類型
  client_flag表示MySQL運行ODBC資料庫的標記
函數傳回值: 如果串連成功,一個MYSQL*串連控制代碼:如果串連失敗,NULL

 

所需標頭檔: #include <mysql/mysql.h>
函數功能: 返回最新的UPDATE,DELETE或INSERT查詢影響的行數
函數傳入值: MYSQL:類型指標
函數傳回值: 大於零的一個整數表示受到影響或檢索出來的行數。零表示沒有區配查序中WHERE子句的記錄或目前還沒有查詢被執行;-1表示查詢返回一個錯誤,或對於一個SELECT查詢

 

所需標頭檔: #include <mysql/mysql.h>
函數功能: 對指定的串連執行查詢
函數原型: int mysql_query(MYSQL *mysql,const char *query);
函數傳入值: query表示執行的SQL語句
函數傳回值: 如果查詢成功,為零,出錯為非零。
相關函數: mysql_real_query

 

所需標頭檔: #include <mysql/mysql.h>
函數功能: 為無緩衝的結果集獲得結果標識符
函數原形: MYSQL_RES *mysql_use_result(MYSQL *mysql);
函數傳入值: MYSQL:類型的指標
函數傳回值: 一個MYSQL_RES結果結構,如果發生一個錯誤發NULL

 

#incluee <mysql/mysql.h>
檢索一個結果集合的下一行
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
MYSQL_RES:結構的指標
下一行的一個MYSQL_ROW結構。如果沒有更多的行可檢索或如果出現一個錯誤,NULL

 

#include <mysql/mysql.h>
返回指定結果集中列的數量
unsigned int mysql_num_fields(MYSQL_RES *res);
MYSQL_RES 結構的指標
結果集合中欄位數量的一個不帶正負號的整數

 

#include <mysql/mysql.h>
建立一個資料庫
int mysql_create_db(MYSQL *mysql,const char *db);
MYSQL:類型的指標
db:要建立的資料庫名
如果資料庫成功地被建立,返回零,如果發生錯誤,為非零。

 

#include <mysql/mysql.h>
選擇一個資料庫
int mysql_select_db(MYSQL *mysql,const char *db);
MYSQL:類型的指標
db:要建立的資料庫名
如果資料庫成功地被建立,返回零,如果發生錯誤,為非零。

 

3、MYSQL操作流程

1.    通過調用mysql_library_init(),初始化MySQL庫。庫可以是mysqlclient C用戶端庫,或mysqld嵌入式伺服器庫,具體情況取決於應用程式是否與“-libmysqlclient”或“-libmysqld”標誌連結。

2.    通過調用mysql_init()初始化串連處理常式,並通過調用mysql_real_connect()串連到伺服器。

3.    發出SQL語句並處理其結果。(在下面的討論中,詳細介紹了使用它的方法)。

4.    通過調用mysql_close(),關閉與MySQL伺服器的串連。

5.    通過調用mysql_library_end(),結束MySQL庫的使用。

 

4、簡單一實例

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

int main(int agrc,char *agrv[])
{
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
int i;

conn = mysql_init(NULL);//初始化串連
if(conn==NULL)
{
printf("mysql_init error\n");
return EXIT_FAILURE;
}
conn = mysql_real_connect(conn,"localhost","root","123456","test",3306,NULL,0);//串連資料庫
if(conn==NULL)
{
printf("mysql_real_connect error");
}

if(mysql_query(conn,"select *from test"))//執行資料庫操作,可以是insert updata,delete操作
{
printf("select error:%s\n",mysql_error(conn));
}

res =mysql_store_result(conn);

int iNum_rows = mysql_num_rows(res);//得到資料集中有幾行
int iNum_fields=mysql_num_fields(res);//得到資料集中有幾列

printf("rows=%d,fields=%d\n",iNum_rows,iNum_fields);

while((row=mysql_fetch_row(res)))//得到一行結果
{
for(i=0;i<iNum_fields;i++)//顯示資料
{
printf("%s\t",row[i]);
}
printf("\n");
}
mysql_free_result(res);//釋放結果集內容
mysql_close(conn);//中斷連線

return EXIT_SUCCESS;

結果顯示:

}

5、makefile編譯

mysqltest:mysqltest.c
  gcc mysqltest.c -L/usr/lib/mysql -lmysqlclient -lstdc++ -ldl -lpthread -lrt -o mysqltest

clean:
  rm -f mysqltest

 

編譯連結:

gcc -g -o mysql mysql1.c -I/usr/include/mysql -L/usr/lib -lmysqlclient -lpthread -lm -lrt -ldl

也可以: gcc -g -o mysql mysql.c $(mysql_config --cflags) $(mysql_config --libs)

解釋:

(1) mysql_config --cflags 尋找mysql編譯相關的標頭檔等資訊。

(2) mysql_config --libs 尋找mysql編譯所需要的庫函數。

(3) -L/usr/lib 指出靜態庫尋找的路徑。在這裡也可以不寫,因為系統會去預設的/lib,/usr/lib去尋找庫函數。如果libmysqlclient.a在/usr/lib/mysql下,那麼-L/usr/lib/mysql 這個目錄。

(4)非標準的庫函數,連結時用-lmysqlclient.原庫名為libmysqlclient.a去掉lib和.a。

(5) -I是包含標頭檔等資訊,及include .

(6) 動態連結程式庫的尋找順序:

a. LD_LIBRARY_PATH設定的目錄下.

b. /etc/ld.so.conf 加到這個檔案中的目錄。

c. 預設的 /usr/lib,/lib目錄下。

 

(7)標頭檔的尋找順序

a. -I所指定的目錄中去尋找

b.gcc的環境變數指定的目錄C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATHc. /usr/include /usr/local/include 等目錄下尋找。

 

(8)靜態庫的尋找順序

a. -L所指定的靜態庫尋找路徑

b.gcc環境變數LIBRARY_PATH

c. /lib ,/usr/lib,/usr/local/lib

C語言操作MYSQL資料庫

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.