mysql是有c語言接口的,安裝相應(yīng)庫后就可以鏈接了,一般連接mysql的函數(shù)是mysql_connect或者mysql_real_connect(大概就是這么拼的吧。。。)可以使用mysql_query執(zhí)行sql語句
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供秦都企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計、網(wǎng)站制作、H5技術(shù)、小程序制作等業(yè)務(wù)。10年已為秦都眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。
1、配置ODBC數(shù)據(jù)源。
2、使用SQL函數(shù)進(jìn)行連接。
對于1、配置數(shù)據(jù)源,配置完以后就可以編程操作數(shù)據(jù)庫了。
對于2、使用SQL函數(shù)進(jìn)行連接,參考代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#includewindows.h
#includesql.h
#includesqlext.h
void main()
{
HENV henv; //環(huán)境句柄
HDBC hdbc; //數(shù)據(jù)源句柄
HSTMT hstmt; //執(zhí)行語句句柄
unsigned char datasource[]="數(shù)據(jù)源名稱"; //即源中設(shè)置的源名稱
unsigned char user[]= "用戶名"; //數(shù)據(jù)庫的帳戶名
unsigned char pwd[]= "密碼"; //數(shù)據(jù)庫的密碼
unsigned char search[]="select xm from stu where xh=0";
SQLRETURN retcode; //記錄各SQL函數(shù)的返回情況
// 分配環(huán)境句柄
retcode= SQLAllocEnv(henv); // 等介于 SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL
, henv);
// 設(shè)置ODBC環(huán)境版本號為3.0
retcode= SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
// 分配連接句柄
retcode= SQLAllocConnect(henv,hdbc); // 等介于 SQLAllocHandle(SQL_HANDLE_DBC, henv, hdbc);
//設(shè)置連接屬性,登錄超時為*rgbValue秒(可以沒有)
// SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)(rgbValue), 0);
//直接連接數(shù)據(jù)源
// 如果是windows身份驗證,第二、三參數(shù)可以是
Mysql C API編程步驟
1、首先我們要包含mysql的頭文件,并鏈接mysql動態(tài)庫。即添加以下語句:
#include WinSock2.h // 進(jìn)行網(wǎng)絡(luò)編程需要winsock2.h
#include mysql.h
#pragma comment(lib, “l(fā)ibmysql.lib”)
2、創(chuàng)建MYSQL變量。如:
MYSQL mysql;
3、初始化MYSQL變量。
mysql_init(mysql);
4、調(diào)用mysql_real_connect函數(shù)連接Mysql數(shù)據(jù)庫。mysql_real_connect函數(shù)的原型如下:
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);
參數(shù)說明:mysql–前面定義的MYSQL變量;host–MYSQL服務(wù)器的地址;user–登錄用戶名;passwd–登錄密碼;db–要連接的數(shù)據(jù)庫;port–MYSQL服務(wù)器的TCP服務(wù)端口;unix_socket–unix連接方式,為NULL時表示不使用socket或管道機(jī)制;clientflag–Mysql運(yùn)行為ODBC數(shù)據(jù)庫的標(biāo)記,一般取0。連接失敗時該函數(shù)返回0。
5、調(diào)用mysql_real_query函數(shù)進(jìn)行數(shù)據(jù)庫查詢。mysql_real_query函數(shù)的原型如下:
int STDCALL mysql_real_query(MYSQL *mysql, const char *q, unsigned long length);
參數(shù)說明:mysql–前面定義的MYSQL變量;q–SQL查詢語句;length–查詢語句的長度。
查詢成功則該函數(shù)返回0。
6、通過調(diào)用mysql_store_result或mysql_use_result函數(shù)返回的MYSQL_RES變量獲取查詢結(jié)果數(shù)據(jù)。
兩個函數(shù)的原型分別為:
MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql);
MYSQL_RES * STDCALL mysql_use_result(MYSQL *mysql);
這兩個函數(shù)分別代表了獲取查詢結(jié)果的兩種方式。第一種,調(diào)用mysql_store_result函數(shù)將從Mysql服務(wù)器查詢的所有數(shù)據(jù)都存儲到客戶端,然后讀?。坏诙N,調(diào)用mysql_use_result初始化檢索,以便于后面一行一行的讀取結(jié)果集,而它本身并沒有從服務(wù)器讀取任何數(shù)據(jù),這種方式較之第一種速度更快且所需內(nèi)存更少,但它會綁定服務(wù)器,阻止其他線程更新任何表,而且必須重復(fù)執(zhí)行mysql_fetch_row讀取數(shù)據(jù),直至返回NULL,否則未讀取的行會在下一次查詢時作為結(jié)果的一部分返回,故經(jīng)常我們使用mysql_store_result。
7、調(diào)用mysql_fetch_row函數(shù)讀取結(jié)果集數(shù)據(jù)。
上述兩種方式最后都是重復(fù)調(diào)用mysql_fetch_row函數(shù)讀取數(shù)據(jù)。mysql_fetch_row函數(shù)的原型如下:
MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);
參數(shù)result就是mysql_store_result或mysql_use_result的返回值。
該函數(shù)返回MYSQL_ROW型的變量,即字符串?dāng)?shù)組,假設(shè)為row,則row〔i〕為第i個字段的值。當(dāng)?shù)浇Y(jié)果集尾部時,此函數(shù)返回NULL。
8、結(jié)果集用完后,調(diào)用mysql_free_result函數(shù)釋放結(jié)果集,以防內(nèi)存泄露。mysql_free_result函數(shù)的原型如下:
void STDCALL mysql_free_result(MYSQL_RES *result);
9、不再查詢Mysql數(shù)據(jù)庫時,調(diào)用mysql_close函數(shù)關(guān)閉數(shù)據(jù)庫連接。mysql_close函數(shù)的原型為:
void STDCALL mysql_close(MYSQL *sock);
//vc工具中添加E:\WAMP\BIN\MYSQL\MYSQL5.5.8\LIB 路徑
//在工程設(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平臺上的編譯
#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));
}
//存儲結(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;
}
有時為了性能,我們會直接用C語言來開發(fā)相關(guān)的模塊,尤其在我們的web應(yīng)用中,雖然PHP、JSP等腳本均提供了MySQL的接口,但是顯然直接使用C語言具有更好的安全性和性能,Michael以前用PHP開發(fā)的多個項目中就使用了C語言編寫的這類接口,然后再編譯到php里面,供php腳本直接使用,這方面的話題就不多說了,下面主要說一下在Linux下如何用C語言連接MySQL數(shù)據(jù)庫,并且讀取里面的數(shù)據(jù)返回,同時如何進(jìn)行編譯。 if defined(_WIN32) || defined(_WIN64)為了支持windows平臺上的編譯#includewindows.h#endif#includestdio.h#includestdlib.h #includemysql.h 我的機(jī)器上該文件在/usr/local/include/mysql下 定義MySQL數(shù)據(jù)庫操作的宏,也可以不定義留著后面直接寫進(jìn)代碼 defineSELECT_QUERYselectusernamefromtbb_userwhereuserid=%dintmain(intargc,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_selectuserid\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'tconnecttoengine!\n%s\n\n,mysql_error(mysql));perror();exit(1);}sprintf(qbuf,SELECT_QUERY,atoi(argv[1])); if(mysql_query(sock,qbuf)){ fprintf(stderr,Queryfailed(%s)\n,mysql_error(sock));exit(1);}if(!(res=mysql_store_result(sock))){fprintf(stderr,Couldn'tgetresultfrom%s\n,mysql_error(sock));exit(1);}printf(numberoffieldsreturned:%d\n,mysql_num_fields(res));while(row=mysql_fetch_row(res)){printf(Theruserid#%d'susernameis:%s\n,atoi(argv[1]),(((row[0]==NULL)(!strlen(row[0])))?NULL:row[0])); puts(queryok!\n);}mysql_free_result(res); mysql_close(sock);exit(0);return0;為了兼容大部分的編譯器加入此行} 編譯的時候,使用下面的命令 gcc -o mysql_select ./mysql_select.c -I/usr/local/include/mysql -L/usr/local/lib/mysql -lmysqlclient (-lz) (-lm) 后面兩個選項可選,根據(jù)您的環(huán)境情況運(yùn)行的時候,執(zhí)行下面的命令 ./mysql_select 1 將返回如下結(jié)果: numberoffieldsreturned:1 Theruserid#1'susernameis:Michaelqueryok!上面的代碼我想大部分都能看明白,不明白的可以參考一下MySQL提供的有關(guān)C語言API部分文檔源碼天空 ,各個函數(shù)都有詳細(xì)說明,有時間我整理一份常用的API說明出來。
mysql是有c語言接口的,安裝相應(yīng)庫后就可以鏈接了,一般連接mysql的函數(shù)是mysql_connect或者mysql_real_connect(大概就是這么拼的吧。。。)可以使用mysql_query執(zhí)行sql語句