C语言与MySQL连接

准备工作

https://blog.csdn.net/qq_53362595/article/details/126425815?ops_request_misc=&request_id=&biz_id=102&utm_term=c语言和mysql数据库连接&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-126425815.142^v71^js_top,201^v4^add_ask&spm=1018.2226.3001.4187

需要一个项目一个项目的配置 不是说直接把VS2022就和mysql连接

打开当前项目的目录 (先随便写点代码生成一下)找到exe文件所在位置

cmysql-image1 cmysql-image2

打开mysql安装目录 在lib目录下找到这两个文件

cmysql-image3

复制到C项目exe文件所在的目录当中去

cmysql-image4

配置

别急着关闭

复制一下libmysql.lib的文件名

cmysql-image5

关闭“打开文件”窗口 回到VS2022

右键项目名 点击属性 找到链接器

cmysql-image6 cmysql-image7

找到“输入”

双击“附加依赖项”或者单击右边的英文 会出现 按钮

cmysql-image8

把刚才复制的libmysql.lib复制进去 点击确定

cmysql-image9

出来之后一定要先点击应用再点击确定

cmysql-image10

返回文件资源管理器 在刚才mysql安装目录找到lib的上一目录

有两个文件夹

cmysql-image11

先选择include文件夹 右键 复制文件地址

cmysql-image12

回到VS2022 在管理器处 右键项目名字 点击属性

找到VC++目录 找到包含目录和库目录 先管头文件的事情

cmysql-image13

点击包含目录

点击 编辑 添加 将刚才复制的include文件地址粘贴进去

cmysql-image14

同理 复制lib文件夹的地址

cmysql-image15 cmysql-image16

粘贴到库目录当中去

包含目录和库目录都变深色了 就说明放进去了

cmysql-image17

记得先点应用 再点确定

小结:

把 libmysql.dll 和 libmysql.lib 文件复制到工程目录下

添加 libmysql.lib

添加 include目录、lib目录

验证

#include<winsock.h>
#include<mysql.h>

输入这两行头文件 看是否报错 没有报错则说明配置成功

连接数据库

#include<stdlib.h>
#include<stdio.h>
#include<winsock.h>
#include<mysql.h>
int main()
{
    MYSQL m;                         mysql连接
    MYSQL_RES* res;                  查询结果集
    MYSQL_ROW row;                   二维数组 存放数据
    mysql_init(&m);                  初始化数据库
    mysql_options(&m, MYSQL_SET_CHARSET_NAME, "gbk");     设置编码方式  防止中文乱码
    if (mysql_real_connect(&m, "localhost", "root", "zw200495", "db1", 3306, NULL, 0))
    {                           //主机       用户名   密码    数据库名  端口
        printf("数据库连接成功\n");
    }                              mysql_real_connect判断是否连接 3306是mysql的端口号
    else {
        printf("数据库连接失败:%s \n", mysql_error(&m));
        //输出错误信息             mysql_error会以字符串形式返回错误信息
    }
    mysql_free_result(res);//释放结果集
    mysql_close(&m);//关闭数据库           连接就一定要有断开 否则堆积会卡顿
    getchar();
    return 0;
}

操作

const char* sql = "insert into student values(2,'李四','女'),(3,'王五','男')";
if (mysql_query(&m, sql))
{
    printf("插入数据失败:%s \n", mysql_error(&m));
}
else
{
    printf("插入数据成功\n");
}

以字符形式传入sql语句

mysql_query函数会对应到数据库中执行操作并给出一个返回值

const char* sql_2 = "delete from student where name = '赵六'";
if (mysql_query(&m, sql_2))
{
    printf("删除数据失败:%s \n", mysql_error(&m));
}
else
{
    printf("删除数据成功\n");
}

const char* sql_3 = "update student set id = 5 where name = '李四'";
if (mysql_query(&m, sql_3))
{
    printf("修改数据失败:%s \n", mysql_error(&m));
}
else
{
    printf("修改数据成功\n");
}

const char* sql_4 = "select ReaderID,Name,ReaderType,BorrowedQuantity from readers where name = '张三'";
if (mysql_query(&m, sql_4))
{
    printf("未查到记录:%s \n", mysql_error(&m));
}
else
{
    printf("查询成功 \n");
}
res = mysql_store_result(&m);
if (res)
{
    printf("获取到数据\n");
}
else
{
    printf("未获取到数据:%s \n", mysql_error(&m));
}
while (row = mysql_fetch_row(res))
{
    printf("%s\t%s\t%s\t%s\n", row[0], row[1], row[2],row[3]);
}

原理:

MYSQL_RES* res;                  查询结果集
MYSQL_ROW row;                   二维数组 存放数据
while (row = mysql_fetch_row(res))
    res不断向下指向记录              查到符合条件的 就把字段分别放入row[0]……row[n]
cmysql-image18 cmysql-image19

所以要显示查询结果 就循环输出row中的数据 row[]的数量须与select后面的字段匹配

否则溢出会乱码或者报错

封装

可以发现 功能包括连接、断开连接、增、删、改、查

是不可以创建数据库的(因为它要和某个数据库连接)

能不能创表不知道

连接

连接应该可以和跟很多不同的数据库连接 相当于用use database;

所以 可以变成 在主函数中写 要和哪个数据库连 就和哪个数据库连

账号密码什么的在本地是不会变的

可以写成

void Join(const char* database)
{
    printf("test\n");
    //这三句放在外面 当全局变量
    //MYSQL m;//mysql连接
    //MYSQL_RES* res; //查询结果集
    //MYSQL_ROW row;  //二维数组,存放数据
    //初始化数据库
    mysql_init(&m);
    //设置编码方式
    mysql_options(&m, MYSQL_SET_CHARSET_NAME, "gbk");
    //连接数据库
    if (mysql_real_connect(&m, "localhost", "root", "zw200495", database, 3306, NULL, 0))
    {                           //主机       用户名   密码      数据库名        端口
        printf("数据库连接成功\n");
    }
    else {
        printf("数据库连接失败:%s \n", mysql_error(&m));
        //输出错误信息
    }
}

主函数只要给出想要连接的数据库的名字就行

int main()
{
    Join("C_D");
    ……

断开

void Release()
{
    mysql_free_result(res);//释放结果集
    mysql_close(&m);
    printf("成功断开连接");
}

void InSert(const char *table, const char* content)
{//                  插入哪个表        插入什么数据
    char sentence[100] = "insert into ";
    strcat_s(sentence,table);
    strcat_s(sentence, " values");
    strcat_s(sentence,content);
    if (mysql_query(&m, sentence))
    {
        printf("插入数据失败:%s \n", mysql_error(&m));
    }
    else
    {
        printf("插入数据成功\n");
    }
}

只需给出想在哪个表插数据 插入的数据是什么就行

InSert("table_1", "('李四', '2022101'), ('王五', '2022102'), ('赵六', '2022103')");

但是对于这种可能不太习惯 因为sql语句还是比较熟练的

或者改成传入一条sql语句

void InSert(const char *sql)

void Delete(const char* table, const char* condition)
{//                  从哪个表删         条件是什么
    char sentence[100] = "delete from  ";
    strcat_s(sentence, table);
    strcat_s(sentence, " where ");
    strcat_s(sentence, condition);
    if (mysql_query(&m,sentence))
    {
        printf("删除数据失败:%s \n", mysql_error(&m));
    }
    else
    {
        printf("删除数据成功\n");
    }
}

主函数中:

Delete("table_1", "name='王五' or name='赵六'");

void Alter(const char* table, const char* condition, const char* content)
{//              修改哪个数据库   修改哪条记录(条件)   把它某字段改成什么(内容)
    char sentence[100] = "update ";
    strcat_s(sentence, table);
    strcat_s(sentence, " set ");
    strcat_s(sentence, content);
    strcat_s(sentence, " where ");
    strcat_s(sentence, condition);
    if (mysql_query(&m, sentence))
    {
        printf("修改数据失败:%s \n", mysql_error(&m));
    }
    else
    {
        printf("修改数据成功\n");
    }
}

主函数中:

Alter("table_1", "name='李四'","name='王炸'");

void Select(const char* sql)
{//          查询语句
    if (mysql_query(&m, sql))
    {
        printf("未查到记录:%s \n", mysql_error(&m));
    }
    else
    {
        printf("查询成功 \n");
    }
    res = mysql_store_result(&m);
    if (res)
    {
        printf("获取到数据\n");
    }
    else
    {
        printf("未获取到数据:%s \n", mysql_error(&m));
    }
}

主函数中:

Select("select name,id from table_1");
//输出结果
printf("name\t id\n");
while (row = mysql_fetch_row(res))
{
    printf("%s\t%s\n", row[0], row[1]);
}

因为%s %s的数量要与查询字段相一致

这个貌似还不知道该怎么封装简单

保险起见 在进行查询查找时 还是得在主函数上写上好几条语句

printf("name\t id\n");是为了对应着好看
cmysql-image20

最终

#include<stdlib.h>
#include<stdio.h>
#include<winsock.h>
#include<mysql.h>
MYSQL m;//mysql连接
MYSQL_RES* res; //查询结果集
MYSQL_ROW row;  //二维数组,存放数据
//连接mysql
void Join(const char* database)
{
    printf("test\n");
    //这三句放在外面 当全局变量
    //MYSQL m;//mysql连接
    //MYSQL_RES* res; //查询结果集
    //MYSQL_ROW row;  //二维数组,存放数据
    //初始化数据库
    mysql_init(&m);
    //设置编码方式
    mysql_options(&m, MYSQL_SET_CHARSET_NAME, "gbk");
    //连接数据库
    if (mysql_real_connect(&m, "localhost", "root", "zw200495", database, 3306, NULL, 0))
    {                           //主机       用户名   密码      数据库名        端口
        printf("数据库连接成功\n");
    }
    else {
        printf("数据库连接失败:%s \n", mysql_error(&m));
        //输出错误信息
    }
}
//向表插入数据
void InSert(const char *table, const char* content)
{//                  插入哪个表        插入什么数据
    char sentence[100] = "insert into ";
    strcat_s(sentence,table);
    strcat_s(sentence, " values");
    strcat_s(sentence,content);
    if (mysql_query(&m, sentence))
    {
        printf("插入数据失败:%s \n", mysql_error(&m));
    }
    else
    {
        printf("插入数据成功\n");
    }
}
void InSert2(const char* sql)
{
    if (mysql_query(&m, sql))
    {
        printf("插入数据失败:%s \n", mysql_error(&m));
    }
    else
    {
        printf("插入数据成功\n");
    }
}
//对表数据删除
void Delete(const char* table, const char* condition)
{//                  从哪个表删         条件是什么
    char sentence[100] = "delete from  ";
    strcat_s(sentence, table);
    strcat_s(sentence, " where ");
    strcat_s(sentence, condition);
    if (mysql_query(&m,sentence))
    {
        printf("删除数据失败:%s \n", mysql_error(&m));
    }
    else
    {
        printf("删除数据成功\n");
    }
}
void Delete2(const char* sql)
{
    if (mysql_query(&m, sql))
    {
        printf("删除数据失败:%s \n", mysql_error(&m));
    }
    else
    {
        printf("删除数据成功\n");
    }
}
//修改
void Alter(const char* table, const char* condition, const char* content)
{//              修改哪个数据库   修改哪条记录(条件)   把它某字段改成什么(内容)
    char sentence[100] = "update ";
    strcat_s(sentence, table);
    strcat_s(sentence, " set ");
    strcat_s(sentence, content);
    strcat_s(sentence, " where ");
    strcat_s(sentence, condition);
    if (mysql_query(&m, sentence))
    {
        printf("修改数据失败:%s \n", mysql_error(&m));
    }
    else
    {
        printf("修改数据成功\n");
    }
}
void Alter2(const char* sql)
{
    if (mysql_query(&m, sql))
    {
        printf("修改数据失败:%s \n", mysql_error(&m));
    }
    else
    {
        printf("修改数据成功\n");
    }
}
//查询
void Select(const char* sql)
{//          查询语句
    if (mysql_query(&m, sql))
    {
        printf("未查到记录:%s \n", mysql_error(&m));
    }
    else
    {
        printf("查询成功 \n");
    }
    res = mysql_store_result(&m);
    if (res)
    {
        printf("获取到数据\n");
    }
    else
    {
        printf("未获取到数据:%s \n", mysql_error(&m));
    }
}
//释放
void Release()
{
    mysql_free_result(res);//释放结果集
    mysql_close(&m);
    printf("成功断开连接");
}
int main()
{
    Join("C_D");
    //InSert("table_1", "('李四', '2022101'), ('王五', '2022102'), ('赵六', '2022103')");
    InSert2("insert into table_1 values('李四', '2022101'), ('王五', '2022102'), ('赵六', '2022103')");
    //Delete("table_1", "name='王五' or name='赵六'");
    Delete2("delete from table_1 where name='王五'");
    //Alter("table_1", "name='李四'","name='王炸'");
    Alter2("update table_1 set name='王二麻子' where name='赵六'");
    Select("select name,id from table_1");
    //输出结果
    printf("name\t id\n");
    while (row = mysql_fetch_row(res))
    {
        printf("%s\t%s\n", row[0], row[1]);
    }
    Release();
    getchar();
    return 0;
}

类形式

Mysql_Connect.h

#pragma once

#include <iostream>
#include <string>
#include <mysql.h>
using namespace std;
class Mysql_Connect
{
    public:
    Mysql_Connect(const string& host, const string& user, const string& password, const string& database, int port = 3306);
    ~Mysql_Connect();
    bool Connect();
    void Close();
    bool CreateRecord(const string& tableName, const string& columnName, const string& value);
    bool UpdateRecord(const string& tableName, const string& columnName, const string& value, const string& condition);
    bool DeleteRecord(const string& tableName, const string& condition);
    bool ExecuteQuery(const string& query);
    MYSQL_RES* GetQueryResult(const string& query);
    private:
    string host_;
    string user_;
    string password_;
    string database_;
    int port_;
    MYSQL* connection_;
};

Mysql_Connect.cpp

#include "Mysql_Connect.h"
Mysql_Connect::Mysql_Connect(const string& host, const string& user, const string& password, const string& database, int port)
: host_(host), user_(user), password_(password), database_(database), port_(port), connection_(nullptr) {
}
Mysql_Connect::~Mysql_Connect() {
    Close();
}
bool Mysql_Connect::Connect()
{
    connection_ = mysql_init(nullptr);
    if (connection_)
    {
        if (mysql_options(connection_, MYSQL_SET_CHARSET_NAME, "gbk") == 0)
        {
            if (mysql_real_connect(connection_, host_.c_str(), user_.c_str(), password_.c_str(), database_.c_str(), port_, nullptr, 0))
            {
                cout << "已连接到MySQL数据库" << endl;
                return true;
            }
            else
            {
                throw runtime_error("连接到MySQL时发生错误:" + string(mysql_error(connection_)));
            }
        }
        else
        {
            throw runtime_error("设置MySQL字符集时发生错误");
        }
    }
    else
    {
        throw runtime_error("初始化MySQL连接时发生错误。");
    }
    return false;
}
void Mysql_Connect::Close()
{
    if (connection_)
    {
        mysql_close(connection_);
        cout << "已断开与MySQL数据库的连接" << endl;
        connection_ = nullptr;
    }
}
bool Mysql_Connect::CreateRecord(const string& tableName, const string& columnName, const string& value)
{
    string query = "INSERT INTO " + tableName + " (" + columnName + ") VALUES ('" + value + "')";
    return ExecuteQuery(query);
}
bool Mysql_Connect::UpdateRecord(const string& tableName, const string& columnName, const string& value, const string& condition)
{
    string query = "UPDATE " + tableName + " SET " + columnName + " = '" + value + "' WHERE " + condition;
    return ExecuteQuery(query);
}
bool Mysql_Connect::DeleteRecord(const string& tableName, const string& condition)
{
    string query = "DELETE FROM " + tableName + " WHERE " + condition;
    return ExecuteQuery(query);
}
bool Mysql_Connect::ExecuteQuery(const string& query)
{
    if (connection_)
    {
        if (mysql_query(connection_, query.c_str()) == 0)
        {
            //cout << "执行成功" << endl;
            return true;
        }
        else
        {
            cerr << "执行失败: " << mysql_error(connection_) << endl;
        }
    }
    return false;
}
MYSQL_RES* Mysql_Connect::GetQueryResult(const string& query)
{
    if (connection_)
    {
        if (mysql_query(connection_, query.c_str()) == 0)
        {
            return mysql_store_result(connection_);
        }
        else
        {
            cerr << "查询失败: " << mysql_error(connection_) << endl;
        }
    }
    return nullptr;
}

main

#include <iostream>
#include "Mysql_Connect.h"
using namespace std;
int main()
{
    try
    {
        // 创建数据库连接
        Mysql_Connect connector("localhost", "root", "zw200495", "机房预约系统");
        if (connector.Connect())
        {
            // 连接成功,执行数据库操作
            // 创建记录
            if (connector.CreateRecord("students", "name", "John"))
            {
                cout << "记录创建成功" << endl;
            }
            else
            {
                cout << "记录创建失败" << endl;
            }
            // 更新记录
            if (connector.UpdateRecord("students", "name", "Alice", "id = 1"))
            {
                cout << "记录更新成功" << endl;
            }
            else
            {
                cout << "记录更新失败" << endl;
            }
            // 删除记录
            if (connector.DeleteRecord("students", "id = 2"))
            {
                cout << "记录删除成功" << endl;
            }
            else
            {
                cout << "记录删除失败" << endl;
            }
            // 执行查询
            string query = "SELECT * FROM students WHERE id > 2";
            MYSQL_RES* result = connector.GetQueryResult(query);
            if (result)
            {
                MYSQL_ROW row;
                while ((row = mysql_fetch_row(result)))
                {
                    cout << "ID: " << row[0] << ", Name: " << row[1] << ", Email: ";
                    if (row[2] != nullptr)
                    {
                        cout << row[2];
                    }
                    else
                    {
                        cout << "NULL";
                    }
                    cout << endl;
                }
                mysql_free_result(result);
            }
            else
            {
                cout << "查询失败" << endl;
            }
            // 断开连接
            connector.Close();
        }
    }
    catch (const std::exception& e)
    {
        cerr << "Error: " << e.what() << endl;
    }
    return 0;
}

附件

📄 C语言与MySQL连接.docx(原 word 笔记):C语言与MySQL连接.docx


⬅️ c与文件读写 🏠 00-编程语言 ➡️ C进阶 图形化 easyX