前言:最近用IPC、socket做ATM、聊天项目,考虑到需要用到数据库,所以总结一下centos、ubantu环境下怎么用C语言操作数据库,例如常见的增删改查等!
一、Centos环境安装mysql
要想进行 C 语言连接MySQL数据库的操作,那么首先要安装数据库,安装数据库挺简单的,这里暂不介绍了。等到 MySQL 安装完毕之后,就可以在 C 语言下连接MySQL数据库了。
首先要安装一个叫 mysql-devel
东西,这个是一个驱动 通过 yum install mysql-devel
命令安装,然后就是在命令行中执行 vim sql.c
命令,然后写代码。
二、介绍数据库相关函数
- mysql_real_connect
函数原型:MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag)
参数说明:
host:本地用localhost或127.0.0.1,远程写IP;
user、passwd:登陆数据库的用户名密码
db:数据库名
port:数据库所用的端口(MySQL一般为3306)
unix_socket:先写个NULL(官方解释:如果unix_socket不是NULL,该字符串描述了应使用的套接字或命名管道)
client_flag:先写个0(指定特定功能) - mysql_real_query
函数原型:int mysql_real_query(MYSQL *mysql, const char *query, unsigned int length)
参数说明:
query:SQL语句;
length:SQL语句长度 - mysql_store_result
函数原型:MYSQL_RES *mysql_store_result(MYSQL *mysql)
返回值说明:具有多个结果的MYSQL_RES结果集合。如果出现错误,返回NULL。 - mysql_fetch_row
函数原型:MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
参数说明:具有多个结果的MYSQL_RES结果集合返回值说明:在mysql_store_result()之后使用时,如果没有更多的行可检索时,mysql_fetch_row()返回NULL。
三、示例代码
- 在执行程序之前需要建一个简单的表,建表语句如下:
CREATE TABLE `person` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(64) NOT NULL DEFAULT '', `age` varchar(64) NOT NULL DEFAULT '', PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`) ) ENGINE=InnoDB AUTO_INCREMENT=52 DEFAULT CHARSET=utf8;
- 程序显示对person表(上面通过建表语句建的表)的插入、查找和删除操作,代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <mysql.h> int main() { MYSQL conn; int res; MYSQL_RES * result; MYSQL_ROW row; mysql_init(&conn); //第三、四和五个参数,需要自己修改一下 if (mysql_real_connect(&conn, "localhost", "usre_name", "password", "DataBase_name", 0, NULL, 0)) { printf("coneect mysql successful\n请选择功能\n"); int choose; char str1[20], str2[20]; char insert_query[80]; char delete_query[50] = "delete from person where name='"; char select_query[] = "select * from person"; printf("1.insert\n2.select\n3.delete\n"); while (scanf("%d", &choose)) { switch (choose) { case 1: //insert printf("姓名 年龄:"); memset(insert_query, 0, sizeof(insert_query)); scanf("%s %s", str1, str2); strcat(insert_query, "insert into person(name,age) values('"); strcat(insert_query, str1); strcat(insert_query, "',"); strcat(insert_query, str2); strcat(insert_query, ")"); printf("SQL语句: %s\n", insert_query); res = mysql_query(&conn, insert_query); if (!res) { printf("insert %lu rows\n", (unsigned long)mysql_affected_rows(&conn)); } else { printf("insert error\n"); } break; case 2: //select printf("SQL语句: %s\n", select_query); if (mysql_query(&conn, select_query) != 0) { fprintf(stderr, "查询失败\n"); exit(1); } else { if ((result = mysql_store_result(&conn)) == NULL) { fprintf(stderr, "保存结果集失败\n"); exit(1); } else { while ((row = mysql_fetch_row(result)) != NULL) { printf("name is %s , ", row[0]); printf("age is %s\n", row[1]); } } } break; case 3: //delete printf("姓名\n"); scanf("%s", str1); strcat(delete_query, str1); strcat(delete_query, "'"); printf("SQL语句: %s\n", delete_query); res = mysql_real_query(&conn, delete_query, (unsigned int)strlen(delete_query)); if (!res) { printf("delete successful\n"); } else { printf("delete error\n"); } break; } } mysql_close(&conn); } return 0; }
编译是要注意链上动态库,编译语句如下:
gcc sql.c -o sql -I/usr/include/mysql -L/usr/lib64/mysql -lmysqlclient
总结:以上就可以完成对Centos环境,用C语言对数据库的操作了
四、Ubantu环境安装mysql
ubuntu上安装mysql非常简单只需要几条命令就可以完成。
#include <mysql/mysql.h> #include <stdio.h> #include <stdlib.h> int main() { MYSQL *conn; MYSQL_RES *res; MYSQL_ROW row; char server[] = "localhost"; char user[] = "root"; char password[] = "mima"; char database[] = "mysql"; conn = mysql_init(NULL); if (!mysql_real_connect(conn, server,user, password, database, 0, NULL, 0)) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(1); } if (mysql_query(conn, "show tables")) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(1); } res = mysql_use_result(conn); printf("MySQL Tables in mysql database:\n"); while ((row = mysql_fetch_row(res)) != NULL) { printf("%s \n", row[0]); } mysql_free_result(res); mysql_close(conn); printf("finish! \n"); return 0; }
编译代码的时候需要链接mysql的库,可以通过如下方式编译:
g++ -Wall mysql_test.cpp -o mysql_test -lmsqlclient
总结:操作数据库是最常见的了,一般公司都会封装好现成的数据库操作函数,但了解一下封装原理,还是很好的!