需求分析:Linux服务器上用vim编译运行C程序,对服务器上的mysql服务器进行读写。(之前的工作参考:Linux如何用vim编写、运行c脚本,Linux服务器安装mysql,Linux系统配置mysql允许被远程访问)
(1)头文件
#include <mysql/mysql.h>
(2)代码第一版
这个程序的功能是:登录本地的mysql,连接本地的名为test的数据库。
#include <stdio.h>
#include <mysql/mysql.h>
int main(int argc, const char *argv[])
{
MYSQL mysql;
const char * host = "127.0.0.1"; //因为是作为本机测试,所以填写的是本地IP
const char * user = "root"; //这里改为你的用户名,即连接MySQL的用户名
const char * passwd = "password"; //这里改为你的用户密码
const char * db = "test"; //这里改为你要连接的数据库的名字,一个数据可能有几张表
unsigned int port = 3306; //这是MySQL的服务器的端口,如果你没有修改过的话就是3306。
const char * unix_socket = NULL; //unix_socket这是unix下的,我在Windows下,所以就把它设置为NULL
unsigned long client_flag = 0; //这个参数一般为0
if (NULL == mysql_init(&mysql)) { //分配和初始化MYSQL对象
printf("mysql_init(): %s\n", mysql_error(&mysql));
return -1;
}
//尝试与运行在主机上的MySQL数据库引擎建立连接
if ( mysql_real_connect(&mysql, host, user, passwd, db, port, unix_socket, client_flag) == NULL ) //连接MySQL
{
printf("mysql_real_connect(): %s\n", mysql_error(&mysql));
return -1;
}
printf("Connected MySQL successful! \n");
mysql_close(&mysql);
return 0;
}
(3)需要注意的是在终端中用gcc命令编译含有mysql操作的c文件时,需要在命令行加入 -lmysqlclient
gcc linuxmysql.c -o linuxmysql -lmysqlclient
(这一步是为了在编译时加入mysql的链接库,不然的话会出现错误:undefined reference to `mysql_init')
注意:上面的程序中连接了名字为test的database,也就是名字为test的数据库,我是用Navicat软件在本地主机远程连接服务器上的数据库,再在里面新建了数据库test。参考:Linux系统配置mysql允许被远程访问)
(4)代码第二版
这一版代码的功能是连接名为test的数据库,读取其中名为test1的表格,将其中所有的数据打印出来
#include <stdio.h>
#include <mysql/mysql.h>
#include <string.h>
int main(int argc, const char *argv[])
{
MYSQL mysql;
MYSQL_RES *res = NULL;
MYSQL_ROW row;
char *query_str = NULL;
int rc, i, fields;
int rows;
if (NULL == mysql_init(&mysql)) {
printf("mysql_init(): %s\n", mysql_error(&mysql));
return -1;
}
if (NULL == mysql_real_connect(&mysql,
"localhost",
"root",
"password",
"test",
3306,
NULL,
0)) {
printf("mysql_real_connect(): %s\n", mysql_error(&mysql));
return -1;
}
printf("1. Connected MySQL successful! \n");
query_str = "select * from test1"; //test1为表格的名字,这句话是mysql选中其中表格的命令
rc = mysql_real_query(&mysql, query_str, strlen(query_str)); //用mysql_real_query执行这条命令
if (0 != rc) {
printf("mysql_real_query(): %s\n", mysql_error(&mysql));
return -1;
}
res = mysql_store_result(&mysql); //读取到的表格数据保存在res中
if (NULL == res) {
printf("mysql_restore_result(): %s\n", mysql_error(&mysql));
return -1;
}
rows = mysql_num_rows(res); //查询表格中的行数,保存到rows里面
printf("The total rows is: %d\n", rows);
fields = mysql_num_fields(res); //也就是查询表格的列数
printf("The total fields is: %d\n", fields);
while ((row = mysql_fetch_row(res))) { //打印出表格中的所有数据
for (i = 0; i < fields; i++) {
printf("%s\t", row[i]);
}
printf("\n");
}
mysql_close(&mysql);
return 0;
}
示例表格:
运行结果:
(5)代码第三版(连接数据mysql数据库test中的表格test1,修改表里面的数据,使用Navicat for MySQL远程连接服务器上的数据库查看数据修改)
#include <stdio.h>
#include <mysql/mysql.h>
#include <string.h>
int main(int argc, const char *argv[])
{
MYSQL mysql;
MYSQL_RES *res = NULL;
MYSQL_ROW row;
char *query_str = NULL;
int rc, i, fields;
int rows;
if (NULL == mysql_init(&mysql)) {
printf("mysql_init(): %s\n", mysql_error(&mysql));
return -1;
}
if (NULL == mysql_real_connect(&mysql,
"localhost",
"root",
"password",
"test",
3306,
NULL,
0)) {
printf("mysql_real_connect(): %s\n", mysql_error(&mysql));
return -1;
}
printf("1. Connected MySQL successful! \n");
//执行插入请求
query_str = "insert into test1 values (12345, 'justtest', '2015-5-5')"; //插入一行数据,这一行数据有三列,也就是这个表格要有三列
rc = mysql_real_query(&mysql, query_str, strlen(query_str));
if (0 != rc) {
printf("mysql_real_query(): %s\n", mysql_error(&mysql));
return -1;
}
//执行删除请求
query_str = "delete from test1 where nihao=3"; //删除一行数据,删除nihao是3的这一行
rc = mysql_real_query(&mysql, query_str, strlen(query_str));
if (0 != rc) {
printf("mysql_real_query(): %s\n", mysql_error(&mysql));
return -1;
}
//然后查询表格中的所有数据,并打印出来
query_str = "select * from test1";
rc = mysql_real_query(&mysql, query_str, strlen(query_str));
if (0 != rc) {
printf("mysql_real_query(): %s\n", mysql_error(&mysql));
return -1;
}
res = mysql_store_result(&mysql);
if (NULL == res) {
printf("mysql_restore_result(): %s\n", mysql_error(&mysql));
return -1;
}
rows = mysql_num_rows(res);
printf("The total rows is: %d\n", rows);
fields = mysql_num_fields(res);
printf("The total fields is: %d\n", fields);
while ((row = mysql_fetch_row(res))) {
for (i = 0; i < fields; i++) {
printf("%s\t", row[i]);
}
printf("\n");
}
mysql_free_result(res);
mysql_close(&mysql);
return 0;
}
原始表格:
删除一行插入一列执行后的结果:
(6)更详尽的mysql c语言API函数描述参考:MySQL入门之常用C语言API
(7)参考链接:
https://www.cnblogs.com/uolo/p/6115448.html
http://blog.csdn.net/alexdream/article/details/2213201
http://www.linuxidc.com/Linux/2011-04/35157.htm
http://blog.csdn.net/qq_21111579/article/details/52051913