开始之前
首先需要头文件
#include <mysql/mysql.h>
#include <stdio.h>
还有没安装的需要先执行
sudo apt-get install libmysqlclient-dev
使用<mysql/mysql.h>
头文件在编译时需要加上-lmysqlclient -I/usr/include/mysql/ -L/usr/lib/mysql
。
使用c语言操作数据库
使用前要先和mysql服务器建立连接,c语言使用MYSQL
结构体作为与mysql服务器的连接,并用mysql_init
函数进行初始化。
使用mysql_real_connnect
函数与mysql服务器建立连接,其中host代表服务器地址,设置为localhost代表本地mysql服务器。user与pwd分别为用户名即密码。db_name代表数据库的名称。
例如按照下方代码相当于在命令行中执行mysql -hlocalhost -uroot -p112188 db
,连接成功后进入本地的db数据库。
MYSQL* connection;
int init()
{
connection = mysql_init(NULL);
if (connection != NULL)
{
perror("mysql_init");
}
else
{
printf("mysql初始化失败\n");
exit(0);
}
//mysql连接
const char *host = "localhost";
const char *user = "root";
const char *pwd = "112188";
const char *db_name = "db";
connection = mysql_real_connect(connection, host, user, pwd, db_name, 0, NULL, 0);
if (connection != NULL)
{
perror("mysql_connect");
}
else
{
printf("mysql连接失败");
exit(0);
}
}
进入之后使用mysql_query(connection, buf)
操作数据库,connection为之前建立的连接,buf为命令,类型为char*
。
例如下方代码的函数可以实现将db数据库中users表中id为userid的行的name列设为给定的name。
比如说调用user_set_name(123, "张三")
可以将123号用户的用户名设置为张三。
void user_set_name(int userid, const char *name)
{
char buf[100];
sprintf(buf, "UPDATE users SET name='%s' WHERE id=%d;", name, userid);
mysql_query(connection, buf);
}
对于有返回信息的命令,c语言使用MYSQL_RES
代表从数据库中返回的结果,MYSQL_ROW
表示从数据库中返回的一行。调用mysql_store_result(connection)
可以返回上次使用mysql_query(connection, buf)
后返回的结果指针。
不难想象返回的结果可以看成矩阵的形式。调用mysql_num_rows(result)
获取结果的行数,mysql_num_fields(result)
获取结果的列数。
调用mysql_fetch_row(result)
可以获取矩阵中的一行,MYSQL_ROW
是char**
类型,即代表一行字符串,每次调用都会获取新的一行。
使用结束后请务必调用mysql_free_result(result)来释放结果,不然会影响下一次的使用。
例如下列user_get_all()
会获取并打印users
表中的所有信息。
void user_get_all()
{
MYSQL_RES* result;
MYSQL_ROW row;
char buf[100];
sprintf(buf, "SELECT a FROM users;");
mysql_query(connection, buf);
result = mysql_store_result(connection);
if (result == NULL)
{
//结果为空
mysql_free_result(result);
printf("null\n");
return;
}
int r = mysql_num_rows(result);
int c = mysql_num_fields(result);
printf("%d %d\n", r, c);
for (int i = 0; i < r; ++i)
{
row = mysql_fetch_row(result);
for (int j = 0; j < c; ++j)
{
if (row[j] == NULL) printf("null ");
else printf("%s ", row[j]);
}
printf("\n");
}
mysql_free_result(result);
}
创建a.c文件,其main函数为
int main()
{
init();
user_get_all();
}
编译运行结果如下