C語言操作Mysql

來源:互聯網
上載者:User

http://andrew913.iteye.com/blog/433280

用C語言做資料庫操作還真不多,一般都選擇檔案操作來搞定。
最近一個項目需要用到MYSQL,就去看了下mysql之c api.
基本上都是一樣的,說白了就是一個應用程式層的協議。正因為做的機會不多,所以要寫下來,免得以後忘記了。

1.首先當然是串連,函數原型如下

C代碼
  1. MYSQL *     STDCALL mysql_real_connect(MYSQL *mysql, constchar *host, 
  2.                        const
    char *user, 
  3.                        const
    char *passwd, 
  4.                        const
    char *db, 
  5.                        unsigned int port, 
  6.                        const
    char *unix_socket, 
  7.                        unsigned long clientflag); 
MYSQL *STDCALL 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 clientflag);

第一個參數 MYSQL是 C api中一個非常重要的變數,裡面記憶體非常豐富,有port,dbname,charset等串連基本參數。它也包含了一個叫st_mysql_methods的結構體變數,該變數裡面儲存著很多函數指標,這些函數指標將會在資料庫連接成功以後的各種資料操作中被調用。
mysql_real_connect函數中各參數,基本都是顧名思意。

串連成功以後就需要執行sql語句。

函數如下原型如下:C代碼

  1. int     STDCALL mysql_query(MYSQL *mysql,constchar *q); 
intSTDCALL mysql_query(MYSQL *mysql, const char *q);

第一個參數上面已經介紹過,第二個參數為要執行的sql語句。
這個函數總體就兩步
(1).發送sql語句,其實就一個socket發送sql 語句,加上mysql固定的協議頭。懶的去看源碼了,抓了下包,如下:
0000   19 00 00 00 03 73 65 6c 65 63 74 20 61 70 70 5f  .....select app_
0010   6e 61 6d 65 20 66 72 6f 6d 20 61 70 70           name from app

紅色部分是協議,前面兩位其實就是包的長度。具體協議沒研究過。

(2).然後就是接受結果,這裡將會調用MYSQL變數中的st_mysql_methods中的read_query_result函數指標

擷取結果
sql執行完以後,如果是查詢語句,我們當然還要讀取資料,如果update,insert等語句,那麼就看下操作成功與否即可。
我們來看看如何擷取查詢結果:

如果mysql_query返回成功,那麼我們就通過mysql_store_result這個函數來讀取結果。原型如下:C代碼

  1. MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql) 
 MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql)

該函數會調用MYSQL變數中的st_mysql_methods中的read_rows函數指標來擷取查詢的結果。同時該函數會返回MYSQL_RES 這樣一個變數,該變數主要用於儲存查詢的結果。同時該函數malloc了一片記憶體空間來儲存查詢過來的資料,所以我們一定要記的free(result),不然是肯定會造成記憶體流失的。

執行完mysql_store_result以後,其實資料都已經在MYSQL_RES 變數中了,下面的api基本就是讀取MYSQL_RES 中的資料。

例如mysql_fetch_row這個函數,就是讀去查詢結果的一行。函數原型如下C代碼

  1. MYSQL_ROW   STDCALL mysql_fetch_row(MYSQL_RES *result); 
MYSQL_ROWSTDCALL mysql_fetch_row(MYSQL_RES *result);

它會返回一個MYSQL_ROW變數,MYSQL_ROW其實就是char **.就當成一個二維數組來用吧。

例如:C代碼

  1. sql_row=mysql_fetch_row(result) 
  2. printf("%s\n",sql_row[0]); 
sql_row=mysql_fetch_row(result)printf("%s\n",sql_row[0]);

還有很多api,不再一一介紹,大部分資訊都在MYSQL_RES MYSQL這兩個結構體中。
具體可以參考mysql官方網站:

http://dev.mysql.com/doc/refman/5.1/en/c.html

突然發現官方網站資料好全面,貌似比任何書都要好。

下面來個例子吧。C代碼

  1. #include<stdio.h> 
  2. #include<stdlib.h> 
  3. #include<string.h> 
  4. #include<mysql/mysql.h> 
  5. #define MAX_COLUMN_LEN  32 
  6. int main(int argc ,char *argv[]) 
  7.     MYSQL my_connection; 
  8.     MYSQL_RES *result; 
  9.     MYSQL_ROW sql_row; 
  10.     MYSQL_FIELD *fd; 
  11.     char column[MAX_COLUMN_LEN][MAX_COLUMN_LEN]; 
  12.     int res; 
  13.     mysql_init(&my_connection); 
  14.     if(mysql_real_connect(&my_connection,"127.0.0.1" 
  15.                             ,"使用者","密碼","資料名稱",3306,NULL,0)) 
  16.     { 
  17.         perror("connect"); 
  18.         res=mysql_query(&my_connection,"select * from app");//查詢 
  19.         if(!res) 
  20.         { 
  21.             result=mysql_store_result(&my_connection);//儲存查詢到的資料到result 
  22.             if(result) 
  23.             { 
  24.                 int i,j; 
  25.                 printf("the result number is %lu\n ",(unsignedlong)mysql_num_rows(result)); 
  26.                 for(i=0;fd=mysql_fetch_field(result);i++)//擷取列名 
  27.                 { 
  28.                     bzero(column[i],sizeof(column[i])); 
  29.                     strcpy(column[i],fd->name); 
  30.                 } 
  31.                 j=mysql_num_fields(result); 
  32.                 for(i=0;i<j;i++) 
  33.                 { 
  34.                     printf("%s\t",column[i]); 
  35.                 } 
  36.                 printf("\n"); 
  37.                 while(sql_row=mysql_fetch_row(result))//擷取具體的資料 
  38.                 { 
  39.                     for(i=0;i<j;i++) 
  40.                     { 
  41.                         printf("%s\t",sql_row[i]); 
  42.                     } 
  43.                     printf("\n"); 
  44.                 } 
  45.                  
  46.             } 
  47.         } 
  48.         else 
  49.         { 
  50.             perror("select"); 
  51.         } 
  52.     } 
  53.     else 
  54.     { 
  55.         perror("connect:error"); 
  56.     } 
  57.     mysql_free_result(MYSQL_RES *result);//釋放結果資源 
  58.     mysql_close(&my_connection);//中斷連線 
  59.  
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<mysql/mysql.h>#define MAX_COLUMN_LEN32int main(int argc , char *argv[]){MYSQL my_connection;MYSQL_RES *result;MYSQL_ROW sql_row;MYSQL_FIELD *fd;char column[MAX_COLUMN_LEN][MAX_COLUMN_LEN];int res;mysql_init(&my_connection);if(mysql_real_connect(&my_connection,"127.0.0.1","使用者","密碼","資料名稱",3306,NULL,0)){perror("connect");res=mysql_query(&my_connection,"select * from app");//查詢if(!res){result=mysql_store_result(&my_connection);//儲存查詢到的資料到resultif(result){int i,j;printf("the result number is %lu\n ",(unsigned long)mysql_num_rows(result));for(i=0;fd=mysql_fetch_field(result);i++)//擷取列名{bzero(column[i],sizeof(column[i]));strcpy(column[i],fd->name);}j=mysql_num_fields(result);for(i=0;i<j;i++){printf("%s\t",column[i]);}printf("\n");while(sql_row=mysql_fetch_row(result))//擷取具體的資料{for(i=0;i<j;i++){printf("%s\t",sql_row[i]);}printf("\n");}}}else{perror("select");}}else{perror("connect:error");}mysql_free_result(MYSQL_RES *result);//釋放結果資源mysql_close(&my_connection);//中斷連線}

上面這個例子就是從一個表中查資料,然後輸出。

如果要insert或者update,只需要修改具體的sql既可。
具體的操作都是通過mysql_query這個函數來搞定。

現在來講編譯的方法吧,這裡我們需要.h以及.so庫。
我們可以在

http://dev.mysql.com/downloads/connector/c/6.0.html

下載Connector/C。
簡單的方法就是:
把裡面include的東西拷貝到/usr/include/mysql/下面去,這樣編譯的時候就不需要加-I了,然後把lib下面的東西拷貝的/usr/lib/下去。

gcc具體的編譯方法:gcc ***.c -o *** -lmysqlclient

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.