C语言与MySQL连接
准备工作
需要一个项目一个项目的配置 不是说直接把VS2022就和mysql连接
打开当前项目的目录 (先随便写点代码生成一下)找到exe文件所在位置
打开mysql安装目录 在lib目录下找到这两个文件
复制到C项目exe文件所在的目录当中去
配置
别急着关闭
复制一下libmysql.lib的文件名
关闭“打开文件”窗口 回到VS2022
右键项目名 点击属性 找到链接器
找到“输入”
双击“附加依赖项”或者单击右边的英文 会出现 按钮
把刚才复制的libmysql.lib复制进去 点击确定
出来之后一定要先点击应用再点击确定
返回文件资源管理器 在刚才mysql安装目录找到lib的上一目录
有两个文件夹
先选择include文件夹 右键 复制文件地址
回到VS2022 在管理器处 右键项目名字 点击属性
找到VC++目录 找到包含目录和库目录 先管头文件的事情
点击包含目录
点击 编辑 添加 将刚才复制的include文件地址粘贴进去
同理 复制lib文件夹的地址
粘贴到库目录当中去
包含目录和库目录都变深色了 就说明放进去了
记得先点应用 再点确定
小结:
把 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]
所以要显示查询结果 就循环输出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");是为了对应着好看
最终
#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
💬 评论