c语言怎么连接mysql数据库 代码

Python018

c语言怎么连接mysql数据库 代码,第1张

//vc工具中添加E:\WAMP\BIN\MYSQL\MYSQL5.5.8\LIB 路径

//在工程设置-》链接》库模块中添加 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"

//定义数据库操作的宏,也可以不定义留着后面直接写进代码

#define SELECT_QUERY "show tables"

int main(int argc, char **argv) //char **argv 相当于 char *argv[]

{

MYSQL mysql,*handle //定义数据库连接的句柄,它被用于几乎所有的MySQL函数

MYSQL_RES *result //查询结果集,结构类型

MYSQL_FIELD *field//包含字段信息的结构

MYSQL_ROW row //存放一行查询结果的字符串数组

char querysql[160] //存放查询sql语句字符串

//初始化

mysql_init(&mysql)

//连接数据库

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]))

//查询数据库

if(mysql_query(handle,querysql)) {

fprintf(stderr,"Query failed (%s)\n",mysql_error(handle))

}

//存储结果集

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))

//读取结果集的内容

while (row = mysql_fetch_row(result)) {

printf("table: %s\n",(((row[0]==NULL)&&(!strlen(row[0]))) ? "NULL" : row[0]) )

}

//释放结果集

mysql_free_result(result)

//关闭数据库连接

mysql_close(handle)

system("PAUSE")

//为了兼容大部分的编译器加入此行

return 0

}

Mysql C API编程步骤

1、首先我们要包含mysql的头文件,并链接mysql动态库。即添加以下语句:

#include <WinSock2.h>// 进行网络编程需要winsock2.h

#include <mysql.h>

#pragma comment(lib, “libmysql.lib”)

2、创建MYSQL变量。如:

MYSQL mysql

3、初始化MYSQL变量。

mysql_init(&mysql)

4、调用mysql_real_connect函数连接Mysql数据库。mysql_real_connect函数的原型如下:

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–前面定义的MYSQL变量;host–MYSQL服务器的地址;user–登录用户名;passwd–登录密码;db–要连接的数据库;port–MYSQL服务器的TCP服务端口;unix_socket–unix连接方式,为NULL时表示不使用socket或管道机制;clientflag–Mysql运行为ODBC数据库的标记,一般取0。连接失败时该函数返回0。

5、调用mysql_real_query函数进行数据库查询。mysql_real_query函数的原型如下:

int STDCALL mysql_real_query(MYSQL *mysql, const char *q, unsigned long length)

参数说明:mysql–前面定义的MYSQL变量;q–SQL查询语句;length–查询语句的长度。

查询成功则该函数返回0。

6、通过调用mysql_store_result或mysql_use_result函数返回的MYSQL_RES变量获取查询结果数据。

两个函数的原型分别为:

MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql)

MYSQL_RES * STDCALL mysql_use_result(MYSQL *mysql)

这两个函数分别代表了获取查询结果的两种方式。第一种,调用mysql_store_result函数将从Mysql服务器查询的所有数据都存储到客户端,然后读取;第二种,调用mysql_use_result初始化检索,以便于后面一行一行的读取结果集,而它本身并没有从服务器读取任何数据,这种方式较之第一种速度更快且所需内存更少,但它会绑定服务器,阻止其他线程更新任何表,而且必须重复执行mysql_fetch_row读取数据,直至返回NULL,否则未读取的行会在下一次查询时作为结果的一部分返回,故经常我们使用mysql_store_result。

7、调用mysql_fetch_row函数读取结果集数据。

上述两种方式最后都是重复调用mysql_fetch_row函数读取数据。mysql_fetch_row函数的原型如下:

MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result)

参数result就是mysql_store_result或mysql_use_result的返回值。

该函数返回MYSQL_ROW型的变量,即字符串数组,假设为row,则row〔i〕为第i个字段的值。当到结果集尾部时,此函数返回NULL。

8、结果集用完后,调用mysql_free_result函数释放结果集,以防内存泄露。mysql_free_result函数的原型如下:

void STDCALL mysql_free_result(MYSQL_RES *result)

9、不再查询Mysql数据库时,调用mysql_close函数关闭数据库连接。mysql_close函数的原型为:

void STDCALL mysql_close(MYSQL *sock)

#ifndef ___LIB_DB___

#define ___LIB_DB___

extern int DB_Open(char * dbcn, char * usr, char * pwd)

extern int DB_Exec(char * sql)

extern void * DB_Query(char *sql, const char *fmt, ...)

extern int DB_Next(void * hRecordset)

extern void DB_CleanQuery(void *hRecordset)

extern int DB_Close(void)

#endif

#ifdef WIN32

#include <windows.h>

#include <odbcinst.h>

#include <sqlext.h>

#else

#include <mysql.h>

#include <unistd.h>

#define SQLHANDLE static MYSQL

#endif

#include <stdarg.h>

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

SQLHANDLE hDBEnv, hDBC

int DB_Open(char * dbcn, char * usr, char * pwd)

{

int r

#ifdef WIN32

r = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hDBEnv)

if(r) return 0

r = SQLSetEnvAttr(hDBEnv,SQL_ATTR_ODBC_VERSION,

(void*)SQL_OV_ODBC3,0)

if(r) return 0

r = SQLAllocHandle(SQL_HANDLE_DBC, hDBEnv, &hDBC)

if(r) return 0

r = SQLConnect(hDBC,

(unsigned char *)dbcn, strlen(dbcn),

(unsigned char *)usr, strlen(usr),

(unsigned char *)pwd, strlen(pwd))

return r==SQL_SUCCESS || r==SQL_SUCCESS_WITH_INFO

#else

mysql_init(&hDBC)

MYSQL * rx = mysql_real_connect(

&hDBC, dbcn, usr, pwd, NULL, 0, NULL, 0)

if(!rx) return 0

return 1

#endif

}//end DB_Open

int DB_Exec(char * sql)

{

#ifdef WIN32

SQLHANDLE hStatement = NULL

SQLAllocHandle(SQL_HANDLE_STMT, hDBC, &hStatement)

SQLExecDirect(hStatement,(unsigned char *)sql, strlen(sql))

SQLCloseCursor(hStatement)

SQLFreeHandle(SQL_HANDLE_STMT, hStatement)

hStatement = NULL

#else

mysql_real_query (&hDBC, sql, strlen(sql))

#endif

return 1

}//end DB_Exec

int DB_Close(void)

{

#ifdef WIN32

SQLDisconnect(hDBC)

SQLFreeHandle(SQL_HANDLE_DBC, hDBC)

SQLFreeHandle(SQL_HANDLE_ENV, hDBEnv)

#else

mysql_close(&hDBC)

#endif

return 1

}//DB_Close()

#ifndef WIN32

typedef struct tagMySQLRecordset {

MYSQL_RES * hRecord

void * * row

int * size

int cols

} MYSQLRecordset

#endif

void DB_CleanQuery(void *hRecordset)

{

if(!hRecordset) return

#ifdef WIN32

__try {

SQLCloseCursor(hRecordset)

SQLFreeHandle(SQL_HANDLE_STMT, hRecordset)

hRecordset = NULL

}__finally{

return

}//end try

#else

MYSQLRecordset * hRec = (MYSQLRecordset *) hRecordset

mysql_free_result (hRec->hRecord)

free(hRec->row) hRec->row = NULL

free(hRec->size)hRec->size = NULL

free(hRec)hRec = NULL

#endif

}//end DB_CleanQuery

int DB_Next(void * hRecordset)

{

int r=0if(!hRecordset) return 0

#ifdef WIN32

r = SQLFetch(hRecordset)

r = r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO

if(!r) {

DB_CleanQuery(hRecordset)

}//end if

#else

MYSQLRecordset * hRec = (MYSQLRecordset *) hRecordset

MYSQL_ROW row = mysql_fetch_row (hRec->hRecord)

if(row) {

for(int i=0i<hRec->colsi++) {

memcpy(hRec->row[i], row[i], hRec->size[i])

}//next i

r = 1

}else{

DB_CleanQuery(hRecordset)

r = 0

}//end if

#endif

return r

}//end DB_Next

int DB_params_count(const char * fmt)

{

int i=0, j=0

while(fmt[i]) {

if(fmt[i]=='%') j++

i++

}//end while

return j

}//end DB_params_count

void * DB_Query(char *sql, const char *fmt, ...)

{

int r=0

int cols = DB_params_count(fmt)

if(cols<1) return NULL

#ifdef WIN32

SQLHANDLE hStatement = NULL

SQLAllocHandle(SQL_HANDLE_STMT, hDBC, &hStatement)

r = SQLExecDirect(hStatement,(unsigned char *)sql, strlen(sql))

r = r==SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO

if(!r) {

return NULL

}//end if

#else

r = mysql_real_query (&hDBC, sql, strlen(sql))

if(r) return NULL

MYSQL_RES * rec = NULL

rec = mysql_store_result (&hDBC)

if(!rec) return NULL

MYSQLRecordset * hStatement

= (MYSQLRecordset *)malloc(sizeof(MYSQLRecordset))

if(!hStatement) return NULL

memset(hStatement, 0, sizeof(MYSQLRecordset))

hStatement->hRecord = rec

hStatement->cols = cols

hStatement->row = (void **)malloc(cols * sizeof(void *))

memset(hStatement->row, 0, cols * sizeof(void *))

hStatement->size = (int *)malloc(cols * sizeof(int))

memset(hStatement->size, 0, cols * sizeof(int))

#endif

va_list apva_start(ap, fmt)

void * varchar buf[32]

int i=0,j=0,k=0,sz=0char c=0

int len = strlen(fmt)int bad=1

#ifdef WIN32

int col=1

#else

int col=0

#endif

while(fmt[i]) {

c = fmt[i++]

if(c != '%') continue

c = fmt[i++]

var = va_arg(ap, void *)

if(c == 'd') {

#ifdef WIN32

SQLBindCol(hStatement, col, SQL_C_SLONG, var, 4,NULL)

#else

hStatement->row[col] = var

hStatement->size[col] = sizeof(long)

#endif

col++

continue

}//end if

if(c == 'f') {

#ifdef WIN32

SQLBindCol(hStatement, col, SQL_C_FLOAT, var, 4,NULL)

#else

hStatement->row[col] = var

hStatement->size[col] = sizeof(float)

#endif

col++

continue

}//end if

memset(buf, 0, 32)bad=1

for(j=i-1j<lenj++) {

c = fmt[j]

if(c>='0' &&c<='9') buf[j-i+1]=c

if(c=='s') {bad=0k=j+1break}

}//next j

if(bad) return NULL

sscanf(buf, "%d", &sz)

#ifdef WIN32

SQLBindCol(hStatement, col, SQL_C_CHAR, var, sz, NULL)

#else

hStatement->row[col] = var

hStatement->size[col] = sz

#endif

col++

i = k

}//end while

va_end(ap)

return hStatement

}//end DB_Rec