原文出处: https://xugaoxiang.com/2019/12/05/operate-mysql-in-c/

软硬件环境

  • ubuntu 18.04 64bit
  • mysql 5.7.22-0ubuntu18.04.1
  • gcc 7.3.0

安装mysql

为方便调试,把server也装上

sudo apt install mysql-server mysql-workbench
sudo apt install libmysqlclient-dev

增删改查操作

基本的注释都写在了代码里了,应该都很容易看懂,主要是几个重要的API的调用。

首先创建数据库db并建一张表, 表结构如下

mysql_in_c_02

/*
 * =====================================================================================
 *
 *       Filename:  mysql_in_c.c
 *       Description:  
 *       Version:   1.0
 *       Created:   2018年07月23日 13时58分15秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *       Author:    xugaoxiang , djstava@gmail.com
 *
 * =====================================================================================
 */

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <mysql/mysql.h>  

#define MYSQL_HOST    "localhost"
#define MYSQL_USER    "root"
#define MYSQL_PASSWD  "toor"
#define DB_NAME "db"
#define TABLE_NAME "students"

/*
 * 测试的数据表结构很简单, number, grade, sex, score 四个字段, 代表学号、年级、性别、分数
*/

/* 连接mysql */  
void mysqldb_connect(MYSQL *mysql)
{  
    if(!mysql_real_connect(mysql, MYSQL_HOST, MYSQL_USER, MYSQL_PASSWD, DB_NAME, 0, NULL, 0)) {  
        printf("\nFailed to connect:%s\n", mysql_error(mysql));  
    } else {
       printf("\nConnect sucessfully!\n"); 
    }
}   

/* 插入数据 */
void mysqldb_insert(MYSQL *mysql, int number, int grade, char *sex, int score)
{  
    int t;  
    char *head = "INSERT INTO ";  
    char query[120];
    char field[48] = "number, grade, sex, score";
    char *left = "(";  
    char *right = ") ";  
    char *values = "VALUES";  
    char message[100] = {0};  

    sprintf(message, "%d, %d, \"%s\", %d", number, grade, sex, score);

    /* 拼接sql命令 */  
    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));  
    } 
    else {
        printf("\nInsert sucessfully!\n");
    }
    
}  

/* 删除数据 */
void mysqldb_delete(MYSQL *mysql, char *field_name, int number)
{  
    int t;
    char *head = "DELETE FROM ";  
    char query[120];  

    sprintf(query, "%s%s where %s =%d", head, TABLE_NAME, field_name, number);
    printf("%s\n", query);

    t = mysql_real_query(mysql, query, strlen(query));
    if (t) {  
        printf("\nFailed to query: %s\n", mysql_error(mysql));  
    } else {
        printf("\nDelete data sucessfully!\n");  
    }
    
}  

/* 更新数据 */
void mysqldb_update(MYSQL *mysql, char *field_name, int score)
{  
    int t;
    char *head = "UPDATE ";
    char query[100];

    sprintf(query, "%s%s SET %s=%d", head, TABLE_NAME, field_name, score);
    printf("%s\n", query);

    t = mysql_real_query(mysql, query, strlen(query));
    if (t) {  
        printf("Failed to update: %s\n", mysql_error(mysql));  
        return;
    }
    printf("\nUpdate data sucessfully!\n");
}

/* 查询数据 */
void mysqldb_query(MYSQL *mysql)  
{  
    int t;
    char *head = "SELECT * FROM ";
    char query[50] = {0};
    MYSQL_RES *res;
    MYSQL_ROW row; 

    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;
    } else {
        printf("\nQuery successfully!\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);
} 

/* 断开mysql连接 */ 
void close_connection(MYSQL *mysql)
{
    mysql_close(mysql);
}

int main(int argc, char *argv[])
{  
    // 准备一组数据
    int number = 1;
    int grade = 1;
    char sex[] = "male";
    int score = 100;

    // 初始化mysql
    MYSQL *mysql = mysql_init(NULL);           
    if (!mysql) {
        printf("\nMysql init failed.\n");
    }

    // 连接MYSQL
    mysqldb_connect(mysql);

    // 插入数据
    mysqldb_insert(mysql, number, grade, sex, score);

    // 更新数据
    mysqldb_update(mysql, "score", 99);

    // 查询数据
    mysqldb_query(mysql);

    // 删除数据
    mysqldb_delete(mysql, "number", number);

    // 断开连接
    close_connection(mysql);

    return 0;  
}

四个操作,在执行前面的操作时,后面暂未执行的可以先注释掉,然后一步步查看结果,看是否和预期的一致。

编译

gcc -o mysql_in_c mysql_in_c.c -lmysqlclient

执行结果

增加一条记录,
mysql_in_c_03

更改一条记录
mysql_in_c_04

查询记录
mysql_in_c_05

删除记录
mysql_in_c_06

参考资料

  1. https://github.com/mysql
GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐