用C操作MYSQL数据库
第一步:啥叫句柄,就是一个数字,就和你去饭店吃饭要排队,前台小姐给你分配了一个编号一样,然后她可以通过编号找到你。而在操作系统或者某种其他编程系统中,句柄就是这样的一个编号,用来对各种奇奇怪怪的东西编号,系统对你来说是一个黑箱,你只能通过这个编号向系统要东西
第二步:C语言操作mysql数据库常用函数
所用到的头文件: mysql/mysql.h
功能: 获得或初始化一个MYSQL句柄
函数原型: MYSQL *mysql_init(MYSQL *mysql)
函数返回值: 一个被始化的MYSQL*句柄
备注: 在内存不足的情况下,返回NULL
函数功能: 连接一个MySQL服务器(在连接之前,必须先进行过初始化)
函数原型:
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 int client_flag);
函数传入值: mysql 连接句柄
host表示MYSQL服务器的主机名或IP
user表示登录的用户名
passwd表示登录的密码
db表示要连接的数据库
port表示MySQL服务器的TCP/IP端口
unix_socket表示连接类型
client_flag表示MySQL运行ODBC数据库的标记,一般为 0
函数返回值: 如果连接成功,返回一个MYSQL*连接句柄:如果连接失败,NULL
函数功能: 关闭一个服务器连接,并释放与连接相关的内存
函数原型: void mysql_close(MYSQL *mysql);
函数传入值: MYSQL:类型的指针
函数返回值: 无
函数功能: 执行SQL 语句
函数原型:
int mysql_real_query(MYSQL *mysql, const char *query, unsigned int length)
函数传入值: query表示执行的SQL语句,length 表示SQL 语句的长度
函数返回值: 如果查询成功,为零,出错为非零
注意:如果查到数据,语句执行成功 。如果没有数据可以查到,那么语句也是执行成功的 。函数执行出错的原因主要有1.SQL 语句出错 。2. 主键的约束等方面 。
函数功能: 获得[结果集]
(https://baike.baidu.com/item/%E7%BB%93%E6%9E%9C%E9%9B%86)
函数原型: MYSQL_RES *mysql_store_result(MYSQL *mysql)
函数传入值: MYSQL 类型的指针
函数返回值: 一个MYSQL_RES结果结构,如果发生错误,返回NULL
函数功能:检索一个结果集的下一行
函数原型:MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
函数传入值:MYSQL_RES:结构的指针
函数返回值:下一行的一个MYSQL_ROW结构。如果没有更多的行可检索或如果出现一个错误,NULL
函数功能:返回指定结果集中列的数量
函数原型:unsigned int mysql_num_fields(MYSQL_RES *res);
函数传入值:MYSQL_RES 结构的指针
函数返回值:结果集中列的数目
注意:要判断是否查询到数据,不能用该函数是否等于 0 去判断 。如果没有查询到数据 ,用该函数判断依然是表的列的数量
函数功能:返回指定结果集中行的数量
函数原型:my_ulonglong mysql_num_rows(MYSQL_RES *result);
函数传入值:MYSQL_RES 结构的指针
函数返回值:结果集中行的数目
注意:要判断是否查询到数据,用该函数是否等于 0 去判断 。等于0 没查到数据 ,否则查到数据
第三步:C语言操作mysql 实例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h>
#define HOST "localhost"
#define USER "root"
#define PASSWD "***********"
#define DB_NAME "TEST000"
void my_error(const char *err_string, int line); // 错误处理函数
void mysql_connect(MYSQL *mysql); // 连接mysql数据库
void show_databases(MYSQL *mysql); // 显示所有数据库
void change_database(MYSQL *mysql); // 改变数据库
void drop_database(MYSQL *mysql); // 删除数据库
void show_tables(MYSQL *mysql); // 显示当前数据库所有表
void desc_table(MYSQL *mysql); // 显示表的字段信息
void drop_table(MYSQL *mysql); // 删除表
void print_table(MYSQL *mysql); // 显示表中内容
void insert_data(MYSQL *mysql); // 插入数据
void update_data(MYSQL *mysql); // 修改数据
void delete_data(MYSQL *mysql); // 删除数据
void close_connection(MYSQL *mysql); // 关闭mysql数据库
int main(int argc, char *argv[])
{
int choice;
char *dir =
"\t1.Show databases\n\
2.Change database\n\
3.Drop database\n\
4.Show tables\n\
5.Desc table\n\
6.Drop table\n\
7.Print table\n\
8.Insert table\n\
9.Update table\n\
10.Delete data";
MYSQL *mysql = mysql_init(NULL); // 创建一个MYSQL句柄并初始化
if (!mysql) {
my_error("mysql_init", __LINE__);
}
// 连接MYSQL数据库
mysql_connect(mysql);
while (1)
{
printf("%s\n",dir);
printf("\nYour choice: ");
scanf("%d", &choice);
switch(choice)
{
case 1:show_databases(mysql);break;
case 2:change_database(mysql);break;
case 3:drop_database(mysql);break;
case 4:show_tables(mysql);break;
case 5:desc_table(mysql); break;
case 6:drop_table(mysql); break;
case 7:print_table(mysql);break;
case 8:insert_data(mysql);break;
case 9:update_data(mysql);break;
case 10:delete_data(mysql);break;
default:printf("No your choice!\n");break;
}
}
close_connection(mysql);
return 0;
}
void my_error(const char *err_string, int line)
{
fprintf(stderr, "line: %d ", line);
perror(err_string);
exit(1);
}
/* 连接mysql数据库 */
void mysql_connect(MYSQL *mysql)
{
if(!mysql_real_connect(mysql, HOST, USER, PASSWD, DB_NAME, 0, NULL, 0)) {
printf("Failed to connect:%s\n", mysql_error(mysql));
my_error("mysql_real_connect", __LINE__);
}
printf("Connect database sucessfully!\n\n");
}
/* 显示所有数据库 */
void show_databases(MYSQL *mysql)
{
int t;
char *query ="show databases";
MYSQL_RES *res; // 返回查询结果
MYSQL_ROW row; // 返回行数据
t = mysql_real_query(mysql, query, strlen(query));
if (t) {
printf("Failed to query: %s\n", mysql_error(mysql));
return;
}
res = mysql_store_result(mysql);
printf("\n");
while (row = mysql_fetch_row(res)) {
for(t = 0; t < mysql_num_fields(res); t++) {
printf("%s\t",row[t]);
}
printf("\n");
}
mysql_free_result(res);
}
/* 改变数据库 */
void change_database(MYSQL *mysql)
{
int t;
char *head = "use ";
char query[30];
char db_name[20];
MYSQL_RES *res; // 返回查询结果
MYSQL_ROW row; // 返回行数据
printf("Please enter the database to change: ");
scanf("%s", db_name);
sprintf(query, "%s%s", head, db_name);
t = mysql_real_query(mysql, query, strlen(query));
if (t) {
printf("Failed to query: %s\n", mysql_error(mysql));
return;
}
printf("\nChange sucessfully!\n\n");
}
/* 删除数据库 */
void drop_database(MYSQL *mysql)
{
int t;
char *head = "drop database ";
char query[50];
char db_name[20];
MYSQL_RES *res; // 返回查询结果
MYSQL_ROW row; // 返回行数据
printf("Please enter the database to drop: ");
scanf("%s", db_name);
sprintf(query, "%s%s", head, db_name);
t = mysql_real_query(mysql, query, strlen(query));
if (t) {
printf("Failed to query: %s\n", mysql_error(mysql));
return;
}
printf("\nDrop database sucessfully!\n\n");
}
/* 打印当前数据库中的表 */
void show_tables(MYSQL *mysql)
{
int t;
char *query = "show tables";
MYSQL_RES *res; // 返回查询结果
MYSQL_ROW row; // 返回行数据
t = mysql_real_query(mysql, query, strlen(query));
if (t) {
printf("Failed to query: %s\n", mysql_error(mysql));
return;
}
res = mysql_store_result(mysql);
printf("\n");
while (row = mysql_fetch_row(res)) {
for(t = 0; t < mysql_num_fields(res); t++) {
printf("%s\t", row[t]);
}
printf("\n");
}
mysql_free_result(res);
}
/* 打印表的字段 */
void desc_table(MYSQL *mysql)
{
int t;
char *head = "desc ";
char table_name[20];
char query[30];
MYSQL_RES *res; // 返回查询结果
MYSQL_ROW row; // 返回行数据
memset(table_name, '\0', sizeof(table_name));
memset(query, '\0', sizeof(query));
printf("Please enter the table name: ");
scanf("%s", table_name);
sprintf(query, "%s%s", head, table_name);
t = mysql_real_query(mysql, query, strlen(query));
if (t) {
printf("Failed to query: %s\n",mysql_error(mysql));
return;
}
res = mysql_store_result(mysql);
printf("\n");
while (row = mysql_fetch_row(res)) {
for(t = 0; t < mysql_num_fields(res); t++) {
printf("%s\t",row[t]);
}
printf("\n");
}
mysql_free_result(res);
}
/* 打印表中数据 */
void print_table(MYSQL *mysql)
{
int t;
char *head = "select * from ";
char table_name[20];
char query[50];
MYSQL_RES *res; // 返回查询结果
MYSQL_ROW row; // 返回行数据
memset(query, '\0', sizeof(query));
memset(table_name, '\0', sizeof(table_name));
printf("Please enter table name: ");
scanf("%s", table_name);
sprintf(query, "%s%s", head,table_name);
t = mysql_real_query(mysql, query, strlen(query));
if (t) {
printf("Failed to query: %s\n", mysql_error(mysql));
return;
}
printf("\nQuery successfully!\n\n");
res = mysql_store_result(mysql);
while (row = mysql_fetch_row(res)) {
for(t = 0; t < mysql_num_fields(res); t++) {
printf("%s\t", row[t]);
}
printf("\n");
}
mysql_free_result(res);
}
/* 删除表 */
void drop_table(MYSQL *mysql)
{
int t;
char *head = "drop table ";
char query[50];
char table_name[20];
MYSQL_RES *res; // 返回查询结果
MYSQL_ROW row; // 返回行数据
printf("Please enter the table to drop: ");
scanf("%s", table_name);
sprintf(query, "%s%s", head, table_name);
t = mysql_real_query(mysql, query, strlen(query));
if (t) {
printf("Failed to query: %s\n", mysql_error(mysql));
return;
}
printf("\nDrop table sucessfully!\n\n");
}
/* 插入数据 */
void insert_data(MYSQL *mysql)
{
int t;
char *head = "insert into ";
char query[200];
char table_name[20];
char field[50];
char *left = "(";
char *right = ") ";
char *values = "values";
char message[100];
MYSQL_RES *res; // 返回查询结果
MYSQL_ROW row; // 返回行数据
memset(field, '\0', sizeof(field));
memset(table_name, '\0', sizeof(table_name));
memset(message, '\0', sizeof(message));
printf("Please enter table_name: ");
scanf("%s", table_name);
printf("Please enter the Field you want to write(split with comma): ");
scanf("%s", field);
printf("Please write the message to the field(split with comma): ");
scanf("%s", message);
/* 把几个变量字符串连接成一个完整的mysql命令 */
sprintf(query, "%s%s%s%s%s%s%s%s%s", head, table_name, left,
field, right, values, left, message, right);
printf("%s\n", query);
t = mysql_real_query(mysql, query, strlen(query));
if (t) {
printf("Failed to query: %s\n", mysql_error(mysql));
return;
}
printf("\nInsert sucessfully!\n\n");
}
/* 删除数据 */
void delete_data(MYSQL *mysql)
{
int t;
char *head = "delete from ";
char query[200];
char table_name[20];
char del_name[20];
MYSQL_RES *res; // 返回查询结果
MYSQL_ROW row; // 返回行数据
memset(table_name, '\0', sizeof(table_name));
memset(del_name, '\0', sizeof(del_name));
printf("Please enter the table: ");
scanf("%s",table_name);
printf("please enter del name: ");
scanf("%s",del_name);
sprintf(query, "%s%s where name =\"%s\"", head, table_name, del_name);
printf("%s\n", query);
t = mysql_real_query(mysql, query, strlen(query));
if (t) {
printf("Failed to query: %s\n", mysql_error(mysql));
return;
}
printf("Delete data sucessfully!\n");
}
/* 更新数据 */
void update_data(MYSQL *mysql)
{
int t;
char *head = "update ";
char query[100];
char table_name[20];
char field_name[20];
char up_value[30];
MYSQL_RES *res; // 返回查询结果
MYSQL_ROW row; // 返回行数据
memset(table_name, '\0', sizeof(table_name));
memset(field_name, '\0', sizeof(field_name));
memset(up_value, '\0', sizeof(up_value));
printf("Please enter the table_name: ");
scanf("%s", table_name);
printf("please enter field_name: ");
scanf("%s", field_name);
printf("please enter up value: ");
scanf("%s", up_value);
sprintf(query, "%s%s set %s=\"%s\"", head, table_name, field_name, up_value);
printf("%s\n", query);
t = mysql_real_query(mysql, query, strlen(query));
if (t) {
printf("Failed to query: %s\n", mysql_error(mysql));
return;
}
printf("Update data sucessfully!\n");
}
void close_connection(MYSQL *mysql)
{
mysql_close(mysql);
}
注意:sprintf 的构造有点拖拉,仅作为连接数据库的实例
执行结果截图: