//vc工具中添加E:\WAMP\BIN\MYSQL\MYSQL5.5.8\LIB 路徑
為柳林等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及柳林網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、柳林網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
//在工程設(shè)置-》鏈接》庫模塊中添加 libmysql.lib
#include stdio.h
#include time.h
#include string.h
#include winsock.h
#include "E:\wamp\bin\mysql\mysql5.5.8\include\mysql.h"
void main(){
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
char *server ="localhost";
char *user ="root";
char *password="";
char *database="test";
char sql[1024]="select * from chinaren";
conn=mysql_init(NULL);
if(!mysql_real_connect(conn,server,user,password,database,0,NULL,0)){
fprintf(stderr,"%s\n",mysql_error(conn));
exit(1);
}
if(mysql_query(conn,sql)){
fprintf(stderr,"%s\n",mysql_error(conn));
exit(1);
}
res=mysql_use_result(conn);
while((row = mysql_fetch_row(res))!=NULL){
printf("%s\n",row[2]);
}
mysql_free_result(res);
mysql_close(conn);
}
===============================
#if defined(_WIN32) || defined(_WIN64) //為了支持windows平臺(tái)上的編譯
#include windows.h
#endif
#include stdio.h
#include stdlib.h
#include "mysql.h"
//定義數(shù)據(jù)庫操作的宏,也可以不定義留著后面直接寫進(jìn)代碼
#define SELECT_QUERY "show tables;"
int main(int argc, char **argv) //char **argv 相當(dāng)于 char *argv[]
{
MYSQL mysql,*handle; //定義數(shù)據(jù)庫連接的句柄,它被用于幾乎所有的MySQL函數(shù)
MYSQL_RES *result; //查詢結(jié)果集,結(jié)構(gòu)類型
MYSQL_FIELD *field ; //包含字段信息的結(jié)構(gòu)
MYSQL_ROW row ; //存放一行查詢結(jié)果的字符串?dāng)?shù)組
char querysql[160]; //存放查詢sql語句字符串
//初始化
mysql_init(mysql);
//連接數(shù)據(jù)庫
if (!(handle = mysql_real_connect(mysql,"localhost","user","pwd","dbname",0,NULL,0))) {
fprintf(stderr,"Couldn't connect to engine!\n%s\n\n",mysql_error(mysql));
}
sprintf(querysql,SELECT_QUERY,atoi(argv[1]));
//查詢數(shù)據(jù)庫
if(mysql_query(handle,querysql)) {
fprintf(stderr,"Query failed (%s)\n",mysql_error(handle));
}
//存儲(chǔ)結(jié)果集
if (!(result=mysql_store_result(handle))) {
fprintf(stderr,"Couldn't get result from %s\n", mysql_error(handle));
}
printf("number of fields returned: %d\n",mysql_num_fields(result));
//讀取結(jié)果集的內(nèi)容
while (row = mysql_fetch_row(result)) {
printf("table: %s\n",(((row[0]==NULL)(!strlen(row[0]))) ? "NULL" : row[0]) ) ;
}
//釋放結(jié)果集
mysql_free_result(result);
//關(guān)閉數(shù)據(jù)庫連接
mysql_close(handle);
system("PAUSE");
//為了兼容大部分的編譯器加入此行
return 0;
}
先看結(jié)構(gòu)體
----------------------------------------------?
以下代碼塊是用來連接數(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;
這個(gè)結(jié)構(gòu)代表返回行的一個(gè)查詢的(SELECT,?SHOW,?DESCRIBE,?EXPLAIN)的結(jié)果。返回的數(shù)據(jù)稱為“數(shù)據(jù)集”,用過數(shù)據(jù)庫的朋友應(yīng)該對(duì)數(shù)據(jù)庫中查詢后得到的結(jié)果集不會(huì)陌生,在C的API里對(duì)應(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
功能:??獲得或初始化一個(gè)MYSQL結(jié)構(gòu)
函數(shù)原型:?MYSQL?*mysql_init(MYSQL?*mysql)
函數(shù)返回值:?一個(gè)被始化的MYSQL*句柄
備注:??在內(nèi)存不足的情況下,返回NULL
所需頭文件:?#include?mysql/mysql.h
函數(shù)功能:?關(guān)閉一個(gè)服務(wù)器連接,并釋放與連接相關(guān)的內(nèi)存
函數(shù)原型:?void?mysql_close(MYSQL?*mysql);
函數(shù)傳入值:?MYSQL:類型的指針
函數(shù)返回值:?無
所需頭文件:?#include?mysql/mysql.h
函數(shù)功能:?連接一個(gè)MySQL服務(wù)器
函數(shù)原型:?MYSQL?*?mysql_connect(MYSQL?*mysql,const?char?*host,const?char?*user,const?char?*passwd);
函數(shù)傳入值:?mysql表示一個(gè)現(xiàn)存mysql結(jié)構(gòu)的地址
host表示MYSQL服務(wù)器的主機(jī)名或IP
user表示登錄的用戶名
passwd表示登錄的密碼
函數(shù)返回值:?如果連接成功,一個(gè)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表示一個(gè)現(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ù)返回值:?如果連接成功,一個(gè)MYSQL*連接句柄:如果連接失敗,NULL
所需頭文件:?#include?mysql/mysql.h
函數(shù)功能:?返回最新的UPDATE,DELETE或INSERT查詢影響的行數(shù)
函數(shù)傳入值:?MYSQL:類型指針
函數(shù)返回值:?大于零的一個(gè)整數(shù)表示受到影響或檢索出來的行數(shù)。零表示沒有區(qū)配查序中WHERE子句的記錄或目前還沒有查詢被執(zhí)行;-1表示查詢返回一個(gè)錯(cuò)誤,或?qū)τ谝粋€(gè)SELECT查詢
所需頭文件:?#include?mysql/mysql.h
函數(shù)功能:?對(duì)指定的連接執(zhí)行查詢
函數(shù)原型:?int?mysql_query(MYSQL?*mysql,const?char?*query);
函數(shù)傳入值:?query表示執(zhí)行的SQL語句
函數(shù)返回值:?如果查詢成功,為零,出錯(cuò)為非零。
相關(guān)函數(shù):?mysql_real_query
所需頭文件:?#include?mysql/mysql.h
函數(shù)功能:?為無緩沖的結(jié)果集獲得結(jié)果標(biāo)識(shí)符
函數(shù)原形:?MYSQL_RES?*mysql_use_result(MYSQL?*mysql);
函數(shù)傳入值:?MYSQL:類型的指針
函數(shù)返回值:?一個(gè)MYSQL_RES結(jié)果結(jié)構(gòu),如果發(fā)生一個(gè)錯(cuò)誤發(fā)NULL
#incluee?mysql/mysql.h
檢索一個(gè)結(jié)果集合的下一行
MYSQL_ROW?mysql_fetch_row(MYSQL_RES?*result);
MYSQL_RES:結(jié)構(gòu)的指針
下一行的一個(gè)MYSQL_ROW結(jié)構(gòu)。如果沒有更多的行可檢索或如果出現(xiàn)一個(gè)錯(cuò)誤,NULL
#include?mysql/mysql.h
返回指定結(jié)果集中列的數(shù)量
unsigned?int?mysql_num_fields(MYSQL_RES?*res);
MYSQL_RES?結(jié)構(gòu)的指針
結(jié)果集合中字段數(shù)量的一個(gè)無符號(hào)整數(shù)
#include?mysql/mysql.h
創(chuàng)建一個(gè)數(shù)據(jù)庫
int?mysql_create_db(MYSQL?*mysql,const?char?*db);
MYSQL:類型的指針
db:要?jiǎng)?chuàng)建的數(shù)據(jù)庫名
如果數(shù)據(jù)庫成功地被創(chuàng)建,返回零,如果發(fā)生錯(cuò)誤,為非零。
#include?mysql/mysql.h
選擇一個(gè)數(shù)據(jù)庫
int?mysql_select_db(MYSQL?*mysql,const?char?*db);
MYSQL:類型的指針
db:要?jiǎng)?chuàng)建的數(shù)據(jù)庫名
如果數(shù)據(jù)庫成功地被創(chuàng)建,返回零,如果發(fā)生錯(cuò)誤,為非零。?
----------------------------------------------?
再看例子:?
很多人用到MySQL來開發(fā)一些項(xiàng)目,有時(shí)為了性能,我們會(huì)直接用C語言來開發(fā)相關(guān)的模塊,尤其在我們的web應(yīng)用中,雖然PHP、JSP等腳本均?提供了MySQL的接口,但是顯然直接使用C語言具有更好的安全性和性能,Michael以前用PHP開發(fā)的多個(gè)項(xiàng)目中就使用了C語言編寫的這類接口,然?后再編譯到php里面,供php腳本直接使用,這方面的話題就不多說了,下面主要說一下在Linux下如何用C語言連接MySQL數(shù)據(jù)庫,并且讀取里面的?數(shù)據(jù)返回,同時(shí)如何進(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平臺(tái)上的編譯
#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;???//.?為了兼容大部分的編譯器加入此行
}
編譯的時(shí)候,使用下面的命令
gcc?-o?mysql_select?./mysql_select.c?-I/usr/local/include/mysql?-L/usr/local/lib/mysql?-lmysqlclient?(-lz)?(-lm)?后面兩個(gè)選項(xiàng)可選,根據(jù)您的環(huán)境情況
運(yùn)行的時(shí)候,執(zhí)行下面的命令
./mysql_select?1
將返回如下結(jié)果:
number?of?fields?returned:?1
Ther?userid?#1?'s?username?is:?Michael
query?ok?!
mysql是有c語言接口的,安裝相應(yīng)庫后就可以鏈接了,一般連接mysql的函數(shù)是mysql_connect或者mysql_real_connect(大概就是這么拼的吧。。。)可以使用mysql_query執(zhí)行sql語句
假如用戶輸入的姓名和年齡值分別保存在變量name,age中:
char sql_insert[200];
sprintf(sql_insert, "INSERT INTO table values('%s','%d');", name, age);
mysql_query(mysql_conn, sql_insert);
上述語句在執(zhí)行完sprintf語句后,sql_insert中保存的是INSERT查詢語句字符串,sql_insert作為mysql_query()語句的參數(shù)即可實(shí)現(xiàn)正確的插入。
方法如下:
1.頭文件:
#include
#include
#include//這個(gè)是必需要包含的,下面對(duì)mysql的所有操作函數(shù),都出自這里
2.定義一個(gè)MYSQL變量:
MYSQLmysql;
這里MYSQL是一個(gè)用于連接MySql數(shù)據(jù)庫的變量。
在后面對(duì)mysql數(shù)據(jù)庫的操作中,我們就用這個(gè)MYSQL變量作為句柄的。
3.定義數(shù)據(jù)庫參數(shù):
charhost[32]=”localhost”;
charuser[32]=”username”;
charpasswd[32]=”pwd”;
chardbname[32]=”testdb”;
4.數(shù)據(jù)庫操作
1).初始化數(shù)據(jù)庫:
mysql_init(mysql);
2).連接數(shù)據(jù)庫:
mysql_real_connect(mysql,host,user,passwd,dbname,0,NULL,0);
我們?cè)诓僮鲿r(shí),可以對(duì)以上的函數(shù)進(jìn)行if測(cè)試,如果初始化或者連接出錯(cuò),作出相應(yīng)提示,以便調(diào)試。
5.對(duì)數(shù)據(jù)庫的操作:
Mysql_query(mysql,“select*fromtestdbwherecondition”);
我們?cè)趯?shí)際操作中,為了更方便的使用程序中的某些變量,我們將會(huì)用到一個(gè)函數(shù):
intsprintf(char*str,constchar*format,?);
這個(gè)函數(shù)用來格式化我們的字符串,然后將變量按照給你的格式,賦給第一個(gè)參數(shù)。
我們使用這個(gè)方法方法可以很方便的使用我們的變量來對(duì)數(shù)據(jù)庫進(jìn)行操作。例如我們將要進(jìn)行數(shù)據(jù)庫的查詢操作,我們就可以這樣使用:
sprintf(sql,”select*fromtestdbwhereusername=‘%s’”,u_name);
然后使用mysql_query(mysql,sql)進(jìn)行查詢。
MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQLAB公司開發(fā),屬于Oracle旗下產(chǎn)品。MySQL是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一,在WEB應(yīng)用方面,MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,關(guān)系數(shù)據(jù)庫管理系統(tǒng))應(yīng)用軟件之一。
鏈表是一種物理存儲(chǔ)單元上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的。鏈表由一系列結(jié)點(diǎn)(鏈表中每一個(gè)元素稱為結(jié)點(diǎn))組成,結(jié)點(diǎn)可以在運(yùn)行時(shí)動(dòng)態(tài)生成。每個(gè)結(jié)點(diǎn)包括兩個(gè)部分:一個(gè)是存儲(chǔ)數(shù)據(jù)元素的數(shù)據(jù)域,另一個(gè)是存儲(chǔ)下一個(gè)結(jié)點(diǎn)地址的指針域。相比于線性表順序結(jié)構(gòu),操作復(fù)雜。由于不必須按順序存儲(chǔ),鏈表在插入的時(shí)候可以達(dá)到O(1)的復(fù)雜度,比另一種線性表順序表快得多,但是查找一個(gè)節(jié)點(diǎn)或者訪問特定編號(hào)的節(jié)點(diǎn)則需要O(n)的時(shí)間,而線性表和順序表相應(yīng)的時(shí)間復(fù)雜度分別是O(logn)和O(1)。
最起碼包含mysql.h
實(shí)例代碼:
#include stdlib.h
#include stdio.h
#include "mysql.h"
int main(int argc, char *argv[]) {
MYSQL *conn_ptr;
conn_ptr = mysql_init(NULL);
if (!conn_ptr) {
fprintf(stderr, "mysql_init failed\n");
return EXIT_FAILURE;
}
conn_ptr = mysql_real_connect(conn_ptr, "localhost", "rick", "secret",
"foo", 0, NULL, 0);//連接數(shù)據(jù)庫
if (conn_ptr) {
printf("Connection success\n");
} else {
printf("Connection failed\n");
}
mysql_close(conn_ptr);
return EXIT_SUCCESS;
}
編譯:(假定上面文件取名 con.c,在當(dāng)前目錄下)
gcc -I/usr/include/mysql con.c -L/usr/lib/mysql -lmysqlclient -o con