--- title: "13-C语言与MySQL连接" created: 2025-11-25 tags: - 项目筑基 --- # C语言与MySQL连接 ### 准备工作 https://blog.csdn.net/qq_53362595/article/details/126425815?ops_request_misc=&request_id=&biz_id=102&utm_term=c%E8%AF%AD%E8%A8%80%E5%92%8Cmysql%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5&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.png]] ![[cmysql-image2.png]] 打开mysql安装目录 在lib目录下找到这两个文件 ![[cmysql-image3.png]] 复制到C项目exe文件所在的目录当中去 ![[cmysql-image4.png]] ### 配置 别急着关闭 复制一下libmysql.lib的文件名 ![[cmysql-image5.png]] 关闭“打开文件”窗口 回到VS2022 右键项目名 点击属性 找到链接器 ![[cmysql-image6.png]] ![[cmysql-image7.png]] 找到“输入” 双击“附加依赖项”或者单击右边的英文 会出现 按钮 ![[cmysql-image8.png]] 把刚才复制的libmysql.lib复制进去 点击确定 ![[cmysql-image9.png]] 出来之后一定要先点击应用再点击确定 ![[cmysql-image10.png]] 返回文件资源管理器 在刚才mysql安装目录找到lib的上一目录 有两个文件夹 ![[cmysql-image11.png]] 先选择include文件夹 右键 复制文件地址 ![[cmysql-image12.png]] 回到VS2022 在管理器处 右键项目名字 点击属性 找到VC++目录 找到包含目录和库目录 先管头文件的事情 ![[cmysql-image13.png]] 点击包含目录 点击 编辑 添加 将刚才复制的include文件地址粘贴进去 ![[cmysql-image14.png]] 同理 复制lib文件夹的地址 ![[cmysql-image15.png]] ![[cmysql-image16.png]] 粘贴到库目录当中去 包含目录和库目录都变深色了 就说明放进去了 ![[cmysql-image17.png]] 记得先点应用 再点确定 ### 小结: 把 libmysql.dll 和 libmysql.lib 文件复制到工程目录下 添加 libmysql.lib 添加 include目录、lib目录 ### 验证 ```c #include #include ``` 输入这两行头文件 看是否报错 没有报错则说明配置成功 ### 连接数据库 ```c #include #include #include #include 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; } ``` ### 操作 #### 增 ```c 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函数会对应到数据库中执行操作并给出一个返回值 #### 删 ```c const char* sql_2 = "delete from student where name = '赵六'"; if (mysql_query(&m, sql_2)) { printf("删除数据失败:%s \n", mysql_error(&m)); } else { printf("删除数据成功\n"); } ``` #### 改 ```c 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"); } ``` #### 查 ```c 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]); } ``` 原理: ```c MYSQL_RES* res; 查询结果集 MYSQL_ROW row; 二维数组 存放数据 while (row = mysql_fetch_row(res)) res不断向下指向记录 查到符合条件的 就把字段分别放入row[0]……row[n] ``` ![[cmysql-image18.png]] ![[cmysql-image19.png]] 所以要显示查询结果 就循环输出row中的数据 row[]的数量须与select后面的字段匹配 否则溢出会乱码或者报错 ### 封装 可以发现 功能包括连接、断开连接、增、删、改、查 是不可以创建数据库的(因为它要和某个数据库连接) 能不能创表不知道 #### 连接 ```c 连接应该可以和跟很多不同的数据库连接 相当于用use database; ``` 所以 可以变成 在主函数中写 要和哪个数据库连 就和哪个数据库连 账号密码什么的在本地是不会变的 可以写成 ```c 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)); //输出错误信息 } } ``` 主函数只要给出想要连接的数据库的名字就行 ```c int main() { Join("C_D"); …… ``` #### 断开 ```c void Release() { mysql_free_result(res);//释放结果集 mysql_close(&m); printf("成功断开连接"); } ``` #### 增 ```c 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"); } } ``` 只需给出想在哪个表插数据 插入的数据是什么就行 ```c InSert("table_1", "('李四', '2022101'), ('王五', '2022102'), ('赵六', '2022103')"); ``` 但是对于这种可能不太习惯 因为sql语句还是比较熟练的 或者改成传入一条sql语句 ```c void InSert(const char *sql) ``` #### 删 ```c 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"); } } ``` 主函数中: ```c Delete("table_1", "name='王五' or name='赵六'"); ``` #### 改 ```c 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"); } } ``` 主函数中: ```c Alter("table_1", "name='李四'","name='王炸'"); ``` #### 查 ```c 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)); } } ``` 主函数中: ```c 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的数量要与查询字段相一致 这个貌似还不知道该怎么封装简单 保险起见 在进行查询查找时 还是得在主函数上写上好几条语句 ```c printf("name\t id\n");是为了对应着好看 ``` ![[cmysql-image20.png]] ### 最终 ```c #include #include #include #include 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 ```c #include #include #include 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 ```c #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 ```c #include #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语言与MySQL连接.docx]] --- ⬅️ [[12-c与文件读写|c与文件读写]] 🏠 [[00-编程语言|00-编程语言]] ➡️ [[14-C进阶 图形化 easyX|C进阶 图形化 easyX]]