首先交代一下,我使用的是mysql8.0.26,使用的编译器为vs,如果大家不会配置如何用vs环境配置c语言环境大家可以电开我的首页进行查看。
首先我们使用c语言连接数据库要认识几个重要的函数以及结构体。
//结构体内容省略typedefstructMYSQL{}MySQL;//此结构表示一个数据库连接的处理程序。typedefstructMYSQL_RES{}MYSQL_RES;//此结构表示返回行(SELECT、SHOW、DESCRIBE、EXPLAIN)的查询的结果。从查询返回的信息在本节的其余部分称为结果集typedefchar**MYSQL_ROW;//这是一行数据的类型安全表示形式。它当前实现为计数字节字符串的数组。(如果字段值可能包含二进制数据,//则不能将这些值视为以null结尾的字符串,因为此类值可能在内部包含空字节。行是通过调用mysql_fetch_row()来获取的。
MYSQL*mysql_init(MYSQL*mysql)//该函数是分配或初始化适合于mysql_real_connect()的对象。//也就是说该函数的返回值我们可以将它当作一个句柄//且该函数的传入参数可以有多种,我们可以传入空值,直接定义变量,或者直接分配空间//如果mysql_init()分配了一个新对象,则在调用mysql_close()关闭连接时将释放该对象。voidmysql_close(MYSQL*mysql)
接下来我们连接数据库并并进行查询操作
MYSQL*mysql_real_connect(MYSQL*mysql,//初始化后MYSQL,这里传入的为地址,如果定义的为变量,要使用constchar*host,//ip地址和主机名constchar*user,//连接的用户,如rootconstchar*passwd,//用户的密码constchar*db,//连接的数据库名字unsignedintport,//端口号,默认为constchar*unix_socket,//如果不是0,则字符串指定要使用的套接字或命名管道。unsignedlongclient_flag)//通常值为0,该值是启用某些功能intmysql_real_query(MYSQL*mysql,constchar*stmt_str,unsignedlonglength)//第二个值必须为单个sql语句,且不用带终止的分号,成功为零。如果发生错误,则为非零。MYSQL_RES*mysql_store_result(MYSQL*mysql)//该函数时调用查询语句后,必须为成功生成结果集的每个语句调用函数,即查询一次调用一次//这些语句(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECKTABLE等)。//完成结果集后,还必须调用mysql_free_result()。MYSQL_ROWmysql_fetch_row(MYSQL_RES*result)//检索结果集的下一行unsignedintmysql_fetch_lengths(MYSQL_RES*result)//返回结果集中的列数
接下来我们实践一下
#includemysql.h#includestdio.hvoidmain(){ MYSQL*mysql; MYSQL_RES*res; MYSQL_ROWrow; mysql=mysql_init(NULL); if(mysql==NULL) { printf("mysqliniterror"); gotoERR; } if(mysql_real_connect(mysql,"47...","root","HGHhgh","bd",,NULL,0)==NULL) { printf("mysql_connecterror:%s",mysql_error(mysql)); gotoERR; } char*query="select*fromuser;"; if(mysql_real_query(mysql,query,strlen(query))!=0) { printf("mysql_queryerror:%s",mysql_error(mysql)); gotoERR; } res=mysql_store_result(mysql); if(res==NULL) { printf("mysql_resulterror:%s",mysql_error(mysql)); gotoERR; } intnum_fields=mysql_num_fields(res); while(row=mysql_fetch_row(res)) { for(inti=0;inum_fields;i++) { printf("%s\t",row[i]); } }ERR: return;}