亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

用C語言操縱Mysql

系統(tǒng) 1941 0

以下代碼塊是用來連接數(shù)據(jù)庫的通訊過程,要連接MYSQL,必須建立MYSQL實(shí)例,通過mysql_init初始化方能開始進(jìn)行連接.

    
      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;
    
  

這個結(jié)構(gòu)代表返回行的一個查詢的( SELECT , SHOW , DESCRIBE , EXPLAIN )的結(jié)果。返回的數(shù)據(jù)稱為“數(shù)據(jù)集”,用過數(shù)據(jù)庫的朋友應(yīng)該對數(shù)據(jù)庫中查詢后得到的結(jié)果集不會陌生,在C的API里對應(yīng)的就是MYSQL_RES了,從數(shù)據(jù)庫讀取數(shù)據(jù),最后就是從MYSQL_RES中讀取數(shù)據(jù)。

    
      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;
    
  

?

----------------------------------------------

再看函數(shù):

?

C語言操作mysql數(shù)據(jù) 常用函數(shù)

所需頭文件: #include <mysql/mysql.h> 功能:? 獲得或初始化一個MYSQL結(jié)構(gòu) 函數(shù)原型: MYSQL *mysql_init(MYSQL *mysql) 函數(shù)返回值: 一個被始化的MYSQL*句柄 備注:? 在內(nèi)存不足的情況下,返回NULL

所需頭文件: #include <mysql/mysql.h> 函數(shù)功能: 關(guān)閉一個服務(wù)器連接,并釋放與連接相關(guān)的內(nèi)存 函數(shù)原型: void mysql_close(MYSQL *mysql); 函數(shù)傳入值: MYSQL:類型的指針 函數(shù)返回值: 無

所需頭文件: #include <mysql/mysql.h> 函數(shù)功能: 連接一個MySQL服務(wù)器 函數(shù)原型: MYSQL * mysql_connect(MYSQL *mysql,const char *host,const char *user,const char *passwd); 函數(shù)傳入值: mysql表示一個現(xiàn)存mysql結(jié)構(gòu)的地址 ? host表示MYSQL服務(wù)器的主機(jī)名或IP ? user表示登錄的用戶名 ? passwd表示登錄的密碼 函數(shù)返回值: 如果連接成功,一個MYSQL *連接句柄:如果連接失敗,NULL 備注:? 該函數(shù)不推薦,使用mysql_real_connect()代替

所需文件: #include <mysql/mysql.h> 函數(shù)功能: 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); 函數(shù)傳入值: mysql表示一個現(xiàn)存mysql結(jié)構(gòu)的地址 ? host表示MYSQL服務(wù)器的主機(jī)名或IP ? user表示登錄的用戶名 ? passwd表示登錄的密碼 ? db表示要連接的數(shù)據(jù)庫 ? port表示MySQL服務(wù)器的TCP/IP端口 ? unix_socket表示連接類型 ? client_flag表示MySQL運(yùn)行ODBC數(shù)據(jù)庫的標(biāo)記 函數(shù)返回值: 如果連接成功,一個MYSQL*連接句柄:如果連接失敗,NULL

所需頭文件: #include <mysql/mysql.h> 函數(shù)功能: 返回最新的UPDATE,DELETE或INSERT查詢影響的行數(shù) 函數(shù)傳入值: MYSQL:類型指針 函數(shù)返回值: 大于零的一個整數(shù)表示受到影響或檢索出來的行數(shù)。零表示沒有區(qū)配查序中WHERE子句的記錄或目前還沒有查詢被執(zhí)行;-1表示查詢返回一個錯誤,或?qū)τ谝粋€SELECT查詢

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

所需頭文件: #include <mysql/mysql.h> 函數(shù)功能: 為無緩沖的結(jié)果集獲得結(jié)果標(biāo)識符 函數(shù)原形: MYSQL_RES *mysql_use_result(MYSQL *mysql); 函數(shù)傳入值: MYSQL:類型的指針 函數(shù)返回值: 一個MYSQL_RES結(jié)果結(jié)構(gòu),如果發(fā)生一個錯誤發(fā)NULL

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

#include <mysql/mysql.h> 返回指定結(jié)果集中列的數(shù)量 unsigned int mysql_num_fields(MYSQL_RES *res); MYSQL_RES 結(jié)構(gòu)的指針 結(jié)果集合中字段數(shù)量的一個無符號整數(shù)

#include <mysql/mysql.h> 創(chuàng)建一個數(shù)據(jù)庫 int mysql_create_db(MYSQL *mysql,const char *db); MYSQL:類型的指針 db:要創(chuàng)建的數(shù)據(jù)庫名 如果數(shù)據(jù)庫成功地被創(chuàng)建,返回零,如果發(fā)生錯誤,為非零。

#include <mysql/mysql.h> 選擇一個數(shù)據(jù)庫 int mysql_select_db(MYSQL *mysql,const char *db); MYSQL:類型的指針 db:要創(chuàng)建的數(shù)據(jù)庫名 如果數(shù)據(jù)庫成功地被創(chuàng)建,返回零,如果發(fā)生錯誤,為非零。

?

----------------------------------------------

再看例子:

????? 很多人用到MySQL來開發(fā)一些項(xiàng)目,有時為了性能,我們會直接用C語言來開發(fā)相關(guān)的模塊,尤其在我們的web應(yīng)用中,雖然PHP、JSP等腳本均 提供了MySQL的接口,但是顯然直接使用C語言具有更好的安全性和性能,Michael以前用PHP開發(fā)的多個項(xiàng)目中就使用了C語言編寫的這類接口,然 后再編譯到php里面,供php腳本直接使用,這方面的話題就不多說了,下面主要說一下在Linux下如何用C語言連接MySQL數(shù)據(jù)庫,并且讀取里面的 數(shù)據(jù)返回,同時如何進(jìn)行編譯。

  這里的大部分代碼參考了MySQL發(fā)行包里面的.c源文件,大家也可以去里面找找相關(guān)的代碼,下面這段代碼實(shí)現(xiàn)了連接到本地MySQL服務(wù)器上9tmd_bbs_utf8數(shù)據(jù)庫,從數(shù)據(jù)表tbb_user中根據(jù)輸入的userid取得該用戶的用戶名并打印輸出到終端。

#if defined ( _WIN32 ) || defined ( _WIN64 ) //為了支持windows平臺上的編譯 #include < windows.h > #endif#include < stdio.h > #include < stdlib.h > #include " mysql.h " ? //我的機(jī)器上該文件在/usr/local/include/mysql下 //定義數(shù)據(jù)庫操作的宏,也可以不定義留著后面直接寫進(jìn)代碼 #define SELECT_QUERY " select username from tbb_user where userid = %d " int main ( int argc , char ** argv ) //char **argv 相當(dāng)于 char *argv[] { ??? MYSQL mysql ,* sock ;??? //定義數(shù)據(jù)庫連接的句柄,它被用于幾乎所有的MySQL函數(shù) ??? MYSQL_RES * res ;?????? //查詢結(jié)果集,結(jié)構(gòu)類型 ??? MYSQL_FIELD * fd ;???? //包含字段信息的結(jié)構(gòu) ??? MYSQL_ROW row ;?????? //存放一行查詢結(jié)果的字符串?dāng)?shù)組 ??? char qbuf [ 160 ] ;????? //存放查詢sql語句字符串 ??? ??? if ( argc != 2 ) { //檢查輸入?yún)?shù) ??????? fprintf ( stderr , " usage : mysql_select <userid> \ n \ n " ) ; ??????? exit ( 1 ) ; ??? } ??? ??? mysql_init ( & mysql ) ; ??? if ( ! ( sock = mysql_real_connect ( & mysql , " localhost " , " dbuser " , " dbpwd " , " 9tmd_bbs_utf8 " , 0 , NULL , 0 ))) { ??????? fprintf ( stderr , " Couldn't connect to engine! \ n%s \ n \ n " , mysql_error ( & mysql )) ; ??????? perror ( "" ) ; ??????? exit ( 1 ) ; ??? } ??? ??? sprintf ( qbuf , SELECT_QUERY , atoi ( argv [ 1 ])) ; ??? if ( mysql_query ( sock , qbuf )) { ??????? fprintf ( stderr , " Query failed (%s) \ n " , mysql_error ( sock )) ; ??????? exit ( 1 ) ; ??? } ??? ??? if ( ! ( res = mysql_store_result ( sock ))) { ??????? fprintf ( stderr , " Couldn't get result from %s \ n " , mysql_error ( sock )) ; ??????? exit ( 1 ) ; ??? } ??? ??? printf ( " number of fields returned: %d \ n " , mysql_num_fields ( res )) ; ??????? ??? while ( row = mysql_fetch_row ( res )) { ??????? printf ( " Ther userid #%d 's username is: %s \ n " , atoi ( argv [ 1 ]) , ((( row [ 0 ] == NULL ) && ( ! strlen ( row [ 0 ]))) ? " NULL " : row [ 0 ])) ; ??????? puts ( " query ok ! \ n " ) ; ??? } ??? ??? mysql_free_result ( res ) ; ??? mysql_close ( sock ) ; ??? exit ( 0 ) ; ??? return 0 ;?? //. 為了兼容大部分的編譯器加入此行 }

編譯的時候,使用下面的命令

gcc -o mysql_select? ./mysql_select.c -I/usr/local/include/mysql -L/usr/local/lib/mysql? -lmysqlclient (-lz) (-lm) 后面兩個選項(xiàng)可選,根據(jù)您的環(huán)境情況

運(yùn)行的時候,執(zhí)行下面的命令

./mysql_select 1

將返回如下結(jié)果:

number of fields returned: 1 Ther userid #1 's username is: Michael query ok !

上面的代碼我想大部分都能看明白,不明白的可以參考一下MySQL提供的有關(guān)C語言API部分文檔,各個函數(shù)都有詳細(xì)說明,有時間我整理一份常用的API說明出來。

用C語言操縱Mysql


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产精品一一在线观看 | 色婷婷基地| 久久99精品久久久久久 | 欧洲一级黄色片 | 久久精品久久久久久久久人 | 精品亚洲一区二区 | 久色视频在线 | 亚洲二三区 | 国产一级毛片夜一级毛片 | 五月婷婷婷婷婷 | 四虎成人在线 | 67194在线午夜亚洲 | 亚洲国产精品一区二区久久 | 亚洲日韩中文字幕在线播放 | 国产成人一区二区三区 | 亚洲午夜在线观看 | 夜夜精品视频 | 日产国产欧美视频一区精品 | 九九综合九九 | 成人在线免费小视频 | 欧美日韩综合精品一区二区三区 | 国产欧美日韩精品第三区 | 午夜免费| 国产成人理在线观看视频 | 欧美成人一区二区三区不卡视频 | 色综合久久综合网欧美综合网 | 色偷偷综合 | 成人性毛片 | 精品伊人久久久99热这里只 | 日日日日日操 | 成人夜色香网站在线观看 | 色网站在线观看 | 67194老司机精品午夜 | 五月四房婷婷 | 麻豆久久婷婷综合五月国产 | 免费一级毛片在播放视频 | 亚洲性视频网站 | 国产乱子伦一区二区三区 | 久久99国产精品久久99无号码 | 成人免费www在线高清观看 | 不一样的天空在线高清观看 |