如何⽤c语⾔开发mysql_如何利⽤C语⾔来开发mysql数据库?如何⽤C语⾔操作MySQL?⾸先你需要对C语⾔连接mysql进⾏结构体的理解,其次还需要对C语⾔的函数有⼀定的了解,最后你还需要熟练⽤⼀些例⼦来进⾏联系。
先看结构体
----------------------------------------------
以下代码块是⽤来连接数据库的通讯过程,要连接MYSQL,必须建⽴MYSQL实例,通过mysql_init初始化⽅能开始进⾏连接. typedefstructst_mysql{
NETnet;/*Communicationparameters*/
gptrconnector_fd;/*ConnectorFdforSSL*/
char*host,*user,*passwd,*unix_socket,
*server_version,*host_info,*info,*db;
unsignedintport,client_flag,server_capabilities;
unsignedintprotocol_version;
unsignedintfield_count;
unsignedintserver_status;
unsignedlongthread_id;/*Idforconnectioninserver*/
my_ulonglongaffected_rows;
my_ulonglonginsert_id;/*idifinsertontablewithNEXTNR*/
my_ulonglongextra_info;/*Usedbymysqlshow*/
unsignedlongpacket_length;
enummysql_statusstatus;
MYSQL_FIELD*fields;
MEM_ROOTfield_alloc;
my_boolfree_me;/*Iffreeinmysql_close*/
my_boolreconnect;/*setto1ifautomaticreconnect*/
structst_mysql_optionsoptions;
charscramble_buff[9];
structcharset_info_st*charset;
unsignedintserver_language;
}MYSQL;
这个结构代表返回⾏的⼀个查询的(SELECT,SHOW,DESCRIBE,EXPLAIN)的结果。返回的数据称为“数据集”,⽤过数据库的朋友应该对数据库中查询后得到的结果集不会陌⽣,在C的API⾥对应的就是MYSQL_RES了,从数据库读取数据,最后就是从MYSQL_RES中读取数据。
typedefstructst_mysql_res{
my_ulonglongrow_count;
unsignedintfield_count,current_field;
MYSQL_FIELD*fields;
MYSQL_DATA*data;
MYSQL_ROWS*data_cursor;
MEM_ROOTfield_alloc;
MYSQL_ROWrow;/*Ifunbufferedread*/
MYSQL_ROWcurrent_row;/*buffertocurrentrow*/
unsignedlong*lengths;/*columnlengthsofcurrentrow*/
MYSQL*handle;/*forunbufferedreads*/
my_booleof;/*Usedmymysql_fetch_row*/
}MYSQL_RES;
----------------------------------------------
再看函数:
C语⾔操作mysql数据常⽤函数
所需头⽂件:#include
功能:获得或初始化⼀个MYSQL结构
函数原型:MYSQL*mysql_init(MYSQL*mysql)
函数返回值:⼀个被始化的MYSQL*句柄
备注:在内存不⾜的情况下,返回NULL
所需头⽂件:#include
函数功能:关闭⼀个服务器连接,并释放与连接相关的内存
函数原型:voidmysql_close(MYSQL*mysql);
函数传⼊值:MYSQL:类型的指针
函数返回值:⽆
所需头⽂件:#include
函数功能:连接⼀个MySQL服务器
函数原型:MYSQL*mysql_connect(MYSQL*mysql,constchar*host,constchar*user,constchar*passwd);
函数传⼊值:mysql表⽰⼀个现存mysql结构的地址
host表⽰MYSQL服务器的主机名或IP
user表⽰登录的⽤户名
passwd表⽰登录的密码
函数返回值:如果连接成功,⼀个MYSQL*连接句柄:如果连接失败,NULL
备注:该函数不推荐,使⽤mysql_real_connect()代替
所需⽂件:#include
函数功能:
MYSQL*mysql_real_connect(MYSQL*mysql,constchar*host,constchar*user,constchar*passwd,constchar*db,unsignedintport,constch
函数传⼊值:mysql表⽰⼀个现存mysql结构的地址
host表⽰MYSQL服务器的主机名或IP
user表⽰登录的⽤户名
passwd表⽰登录的密码
db表⽰要连接的数据库
port表⽰MySQL服务器的TCP/IP端⼝
unix_socket表⽰连接类型
client_flag表⽰MySQL运⾏ODBC数据库的标记
函数返回值:如果连接成功,⼀个MYSQL*连接句柄:如果连接失败,NULL
所需头⽂件:#include
函数功能:返回最新的UPDATE,DELETE或INSERT查询影响的⾏数
函数传⼊值:MYSQL:类型指针
函数返回值:⼤于零的⼀个整数表⽰受到影响或检索出来的⾏数。零表⽰没有区配查序中WHERE⼦句的记录或⽬前还没有查询被执⾏;-1表
⽰查询返回⼀个错误,或对于⼀个SELECT查询
所需头⽂件:#include
函数功能:对指定的连接执⾏查询
函数原型:intmysql_query(MYSQL*mysql,constchar*query);
函数传⼊值:query表⽰执⾏的SQL语句
函数返回值:如果查询成功,为零,出错为⾮零。
相关函数:mysql_real_query
所需头⽂件:#include
函数功能:为⽆缓冲的结果集获得结果标识符
函数原形:MYSQL_RES*mysql_use_result(MYSQL*mysql);
函数传⼊值:MYSQL:类型的指针
函数返回值:⼀个MYSQL_RES结果结构,如果发⽣⼀个错误发NULL
#incluee
检索⼀个结果集合的下⼀⾏
MYSQL_ROWmysql_fetch_row(MYSQL_RES*result);
MYSQL_RES:结构的指针
下⼀⾏的⼀个MYSQL_ROW结构。如果没有更多的⾏可检索或如果出现⼀个错误,NULL
#include
返回指定结果集中列的数量
unsignedintmysql_num_fields(MYSQL_RES*res);
MYSQL_RES结构的指针
结果集合中字段数量的⼀个⽆符号整数
#include
创建⼀个数据库
intmysql_create_db(MYSQL*mysql,constchar*db);
MYSQL:类型的指针
db:要创建的数据库名
如果数据库成功地被创建,返回零,如果发⽣错误,为⾮零。
#include
选择⼀个数据库
intmysql_select_db(MYSQL*mysql,constchar*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取得该⽤户的⽤户名并打印输出到终端。
#ifdefined(_WIN32)||defined(_WIN64)//为了⽀持windows平台上的编译
#include
#endif
#include
#include
#include"mysql.h"//我的机器上该⽂件在/usr/local/include/mysql下
//定义数据库操作的宏,也可以不定义留着后⾯直接写进代码
#defineSELECT_QUERY"selectusernamefromtbb_userwhereuserid=%d"
intmain(intargc,char**argv)//char**argv相当于char*argv[]
{
MYSQLmysql,*sock;//定义数据库连接的句柄,它被⽤于⼏乎所有的MySQL函数
MYSQL_RES*res;//查询结果集,结构类型
MYSQL_FIELD*fd;//包含字段信息的结构
MYSQL_ROWrow;//存放⼀⾏查询结果的字符串数组
charqbuf[160];//存放查询sql语句字符串
if(argc!=2){//检查输⼊参数
fprintf(stderr,"usage:mysql_select\\n\\n");
exit(1);
}
mysql_init(&mysql);
c语言如何创建字符串数组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);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。