C语言简单操作MYSQL数据库
因为最近聊天室的项目需要使用数据库,所以我在这里写一篇博客来讲解一下如何用c语言来使用聊天室;
1.主要函数解析
mysql_init(MYSQL *mysql)
初始化一个句柄;
mysql_library_init(0, NULL, NULL)
初始化数据库;
mysql_real_connect(&mysql, "127.0.0.1", "root", "520520cw...", "happy", 0, NULL, 0)
连接数据库的重要一步:
- 参数1: 调用
mysql_init
初始化的句柄 - 参数2:本机上的数据库就填
127.0.0.1
- 参数3:数据库的所有者一般填
root
- 参数4:数据库的密码、
- 参数5:所要使用的数据库的名字
- 参数6\7\8:一般为系统默认的就填
0,NULL,0
;
接下来还有最重要的一步就是为你的数据库设置中文字符集,不然你数据库里的中文打印出来会变成 ??
mysql_set_character_set(&mysql, "utf8")
好了到此为止数据库就和你写的C程序连接在了一起;
2.简单使用数据库
如何使用数据库,其实和在数据库里面差不多,就是把在数据库里面使用的语句变成字符串存到一个数组里,然后调用相关函数就可以了;
mysql_query(MYSQL *mysql, const char* string)
其中第一个参数是初始化的句柄,第二个就是你进行操作的语句这个语句是不带分号的是和在数据库内部直接操作是有一点不同的;
例如我需要修改happy
数据库里sad
这张数据表的的一个数据
mysql_query(&mysql, "udpate sad set name = \"xzwb\" where some = \"123\"")
这样就可以将修改sad
表中some
是123
的数据的name
修改为xzwb
;
3.使用数据库查询数据
一般我们使用数据库最常用的的就是查询数据,那我么要怎么样查询数据呢,其实都是调用函数;
假设我们现在要查询happy
数据库中sad
这张数据表中的数据
我们在上面调用完了mysql_query(&mysql, "select *form sad")
以后调用成功返回0;
然后我们使用MYSQL_RES *result = mysql_store_result(&mysql))
这个函数会返回你查询到的所有数据;包括(表头,每一行的数据);如果没有查到数据那么result为空
像修改数据,删除数据都会返回空
我们要怎么样去读取result
里面的东西呢?
3.1读取表头
我们会使用unsigned int num_fields = mysql_num_fields(result)
这个函数会返回你这张表有多少列;现在num_fields
就代表我们这张表的列数;
进入正题读取表头(其实在我们写聊天室的时候是不需要读取表头的因为你创建好了数据表每次都会使用where
子句所以每次只会返回一行数据,在那一行里你知道自己是怎么建表的所以知道第几列放的是啥)
MYSQL_FIELD *field = mysql_fetch_field(result)
这个函数每次会返回一个表头信息,所以如果我们要打印整个表头:
while ( (field = mysql_fetch_field(result) ) ) {
printf("%-20s", field->name);
}
printf("\n");
3.2读取每一行的数据
MYSQL_ROW row = mysql_fetch_row(result)
使用这个函数每次就会返回一行,其实这里的row
就是一个字符串数组通过row[0] row[1].....
来查看或者使用表里面的数据;
例如我们现在要打印:
while (row = mysql_fetch_row(result)) {
for (int i = 0; i < num_fields; i++) {
printf("%-20s", row[i]);
}
printf("\n");
}
上面的num_fields
是我们之前取得的有多少列;
记住我们这里读取到的全部都是字符串,所以我们不能直接与整形数据进行比较;
例如我没现在要用row[0]
和int i = 5
比较
if (i == atoi(row[0])) {
...
...
}
4.sprintf函数
我觉得sprintf
这个函数在操作数据库的时候很有用;
例如:
char name[] = "xzwb";
char buff[100];
sprintf(buff, "select *from sad where name = \"%s\"", name);
这样就很实用;
5.关闭数据库
差点忘记了,最后不要忘记关闭数据库的连接
mysql_close(&mysql);
mysql_library_end();
6.样例展示
接下来会展示一个我简单封装过的数据表的打印
MYSQL accept_mysql(void)
{
MYSQL mysql;
if(NULL == mysql_init(&mysql)){
my_err("mysql_init", __LINE__);
}
//初始化数据库
if(mysql_library_init(0, NULL, NULL) != 0){
my_err("mysql_library_init", __LINE__);
}
//连接数据库
if(NULL == mysql_real_connect(&mysql, "127.0.0.1", "root", "520520cw...", "happy", 0, NULL, 0)){
my_err("mysql_real_connect", __LINE__);
}
//设置中文字符集
if(mysql_set_character_set(&mysql, "utf8") < 0){
my_err("mysql_set_character_set", __LINE__);
}
printf("连接mysql数据库成功!\n");
return mysql;
}
int use_mysql(const char *string, MYSQL mysql1)
{
int i;
int ret;
unsigned int num_fields;
MYSQL mysql = mysql1;
MYSQL_RES *result = NULL;
MYSQL_ROW row;
MYSQL_FIELD *field;
ret = mysql_query(&mysql, string);
if(!ret){
result = mysql_store_result(&mysql);
if(result){
num_fields = mysql_num_fields(result);
while((field = mysql_fetch_field(result))){
printf("%-20s", field->name);
}
printf("\n");
while(row = mysql_fetch_row(result)){
for(i = 0; i < num_fields; i++){
if(row[i]){
printf("%-20s", row[i]);
}
}
printf("\n");
}
}
mysql_free_result(result);
}
else{
printf("query fail\n");
return -1;
}
return 0;
}
int close_mysql(MYSQL mysql)
{
mysql_close(&mysql);
mysql_library_end();
printf("end\n");
return 0;
}