用C說話操作MySQL數據庫的通用辦法。本站提示廣大學習愛好者:(用C說話操作MySQL數據庫的通用辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是用C說話操作MySQL數據庫的通用辦法正文
在我們的web運用中,固然PHP、JSP等劇本均供給了MySQL的接口,然則明顯直接應用C說話具有更好的平安性和機能,在這篇文章中可以或許有所表現。
先看構造體:
以下代碼塊是用來銜接數據庫的通信進程,要銜接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;
這個構造代表前往行的一個查詢的(SELECT, SHOW, DESCRIBE, EXPLAIN)的成果。前往的數據稱為“數據集”,用過數據庫的同伙應當對數據庫中查詢後獲得的成果集不會生疏,在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;
--------------------------------
再看函數:
C說話操作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:要創立的數據庫名 假如數據庫勝利地被創立,前往零,假如產生毛病,為非零。
----------------------------------------------
--------------
再看例子:
許多人用到MySQL來開辟一些項目,有時為了機能,我們會直接用C說話來開辟相干的模塊,特別在我們的web運用中,固然PHP、JSP等劇本均供給了MySQL的接口,然則明顯直接應用C說話具有更好的平安性和機能,Michael之前用PHP開辟的多個項目中就應用了C說話編寫的這類接口,然後再編譯到php外面,供php劇本直接應用,這方面的話題就不多說了,上面重要說一下在Linux下若何用C說話銜接MySQL數據庫,而且讀取外面的 數據前往,同時若何停止編譯。
這裡的年夜部門代碼參考了MySQL刊行包外面的.c源文件,年夜家也能夠去外面找找相干的代碼,上面這段代碼完成了銜接到當地MySQL辦事器上9tmd_bbs_utf8數據庫,從數據表tbb_user中依據輸出的userid獲得該用戶的用戶名並打印輸入到終端。
#if defined(_WIN32) || defined(_WIN64) //為了支撐windows平台上的編譯 #include <windows.h> #endif #include <stdio.h> #include <stdlib.h> #include "mysql.h" //我的機械上該文件在/usr/local/include/mysql下 //界說數據庫操作的宏,也能夠不界說留著前面直接寫進代碼 #define SELECT_QUERY "select username from tbb_user where userid = %d" int main(int argc, char **argv) //char **argv 相當於 char *argv[] { MYSQL mysql,*sock; //界說數據庫銜接的句柄,它被用於簡直一切的MySQL函數 MYSQL_RES *res; //查詢成果集,構造類型 MYSQL_FIELD *fd ; //包括字段信息的構造 MYSQL_ROW row ; //寄存一行查詢成果的字符串數組 char qbuf[160]; //寄存查詢sql語句字符串 if (argc != 2) { //檢討輸出參數 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) 前面兩個選項可選,依據您的情況情形
運轉的時刻,履行上面的敕令
./mysql_select 1
將前往以下成果:
number of fields returned: 1
Ther userid #1 ‘s username is: Michael
query ok !
以上就是本文的全體內容,願望對年夜家的進修有所贊助。