linux下用C语言连接mysql实现增删改查

公司内部培训,领导要求在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 ,可能导致找不到头文件 或者 函数未定义的错误
by
无报错,编译成功。

查看表:
select

执行程序:
exe

再次查看表bbb:
select_2

数据插入成功!

更新、删除操作类似,只需改一下sql语句即可。