公司内部培训,领导要求在linux环境下用c语言连接mysql数据库,实现增删改查功能,做一个demo。
环境:Red Hat Enterprise Linux 4
①安装mysql
②创建数据库表:bbb
CREATE TABLE `bbb` (
`id` int(11) NOT NULL auto_increment,
`name2` varchar(20) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
C的代码:
#include
#include
#include
#include
/*定义数据库连接需要的宏*/
#define HOST "localhost"
#define USERNAME "root"
#define PASSWORD "ictspace"
#define DATABASE "test"
/*执行传入的sql語句*/
void exe_sql(char* sql) {
MYSQL my_connection; /*这是一个数据库连接*/
int res; /*执行sql語句后的返回标志*/
/*初始化mysql连接my_connection*/
mysql_init(&my_connection);
if (mysql_real_connect(&my_connection, HOST, USERNAME, PASSWORD,DATABASE, 0, NULL, 0)) {
/*连接成功*/
printf("数据库执行exe_sql连接成功!n");
mysql_query(&my_connection, "set names utf8");
/*mysql_query函数执行传入的sql語句,返回一个int值,如果为0,执行成功*/
res = mysql_query(&my_connection, sql);
if (res) {/*执行失败了*/
printf("Error: mysql_query !\n");
mysql_close(&my_connection);
} else {/*执行成功了*/
/*mysql_affected_rows返回执行sql后影响的行数*/
printf("%d 行受到影响!\n", mysql_affected_rows(&my_connection));
mysql_close(&my_connection);
}
} else {
/*数据库连接失败*/
printf("数据库执行exe_sql连接失败!\n");
}
}
/*执行传入的sql語句,并打印出查询結果*/
void query_sql(char* sql) {
MYSQL my_connection; /*这是一个数据库连接*/
int res; /*执行sql語句后的返回标志*/
MYSQL_RES *res_ptr; /*指向查询结果的指针*/
MYSQL_FIELD *field; /*字段结构指针*/
MYSQL_ROW result_row; /*按行返回的查询信息*/
int row, column; /*查询返回的行数和列数*/
int i, j; /*只是控制循环的两个变量*/
/*初始化mysql连接my_connection*/
mysql_init(&my_connection);
if (mysql_real_connect(&my_connection, HOST, USERNAME, PASSWORD,DATABASE, 0, NULL, 0)) {/*连接成功*/
printf("数据库查询query_sql连接成功!\n");
mysql_query(&my_connection, "set names utf8");
/*执行传入的sql語句,返回一个int值,如果为0,证明語句执行成功*/
res = mysql_query(&my_connection, sql);
if (res) { /*执行失败*/
printf("Error: mysql_query !\n");
mysql_close(&my_connection);
} else {
/*执行成功了*/
/*将查询的結果给res_ptr*/
res_ptr = mysql_store_result(&my_connection);
/*如果结果不为空,就把结果print*/
if (res_ptr) {
/*取得結果的行数和*/
column = mysql_num_fields(res_ptr);
row = mysql_num_rows(res_ptr);
printf("查询到 %lu 行 \n", row);
/*输出結果的字段名*/
for (i = 0; field = mysql_fetch_field(res_ptr); i++)
printf("%s\t", field->name);
printf("\n");
/*按行输出結果*/
for (i = 1; i < row; i++) {
result_row = mysql_fetch_row(res_ptr);
for (j = 0; j < column; j++)
printf("%s\t", result_row[j]);
printf("\n");
}
}
mysql_close(&my_connection);
}
}
}
int main(int argc, char *argv[]) {
char *query;
/*插入操作*/
char *exe = "insert into bbb values('','eee');";
/*更新操作*/
//char *exe = "update `bbb` set `name2` = 'zzz' where `id` = 10";
/*删除操作*/
//char *exe = "delete from bbb where `name2` = 'eee'";
exe_sql(exe);
/*测试查询*/
query="select * from bbb;";
query_sql(query);
return 0;
}
编译命令:
gcc-o c_mysql_demo -g c_mysql_demo.c -I /usr/include/mysql/ -L /usr/lib/ -l mysqlclient
参数说明:
-I(大写的i) 表示要连接的头文件目录,因为使用了<mysql.h> ,-L表示要连接的库文件目录 -l(小写的L) 表示要连接的具体的库名称,在/usr/lib/ 下,有叫做libmysqlclient.so的库,指定具体的库的名字时,默认去掉头尾的lib和.so直接使用中间的mysqlclient
如果不用-I -L ,可能导致找不到头文件 或者 函数未定义的错误

无报错,编译成功。
查看表:

执行程序:

再次查看表bbb:

数据插入成功!
更新、删除操作类似,只需改一下sql语句即可。