C语言实现数据库MYSQL连接的完整踩坑过程
起因
起初我写过一个c++的网吧管理系统在大一的时候,刚开始的时候用的是c语言通过文件去管理网吧的一些信息,后来利用面向对象的设计思路用数据库的方式去重新实现了一套方案。
vs2019中使用c语言连接数据库出现了各种的问题,网上找了很久才发现一套完整的解决方案!
感谢这个博主,太感谢了!
- 首先需要确保你的电脑安装了MySQL数据库 具体教程参见我的MySQL安装的博客
以下是链接数据库的教程 我使用的是vs2019
- 修改运行的环境是64位 解决方案右键属性 配置属性为debug 64位
- 重点是链接数据库的include 和lib
在附加包含目录中添加你的数据库的include文件的位置
在连接器->常规->附加库目录
在链接器->常规->附加依赖项 写一个libmysql.lib就可以
然后把mysqllib.dll文件放到项目文件里面,不然会报错
测试程序: 修改自己的数据库对应的信息即可
#include <stdio.h>
#include <Windows.h>
#include <mysql.h>
#include<iostream>
using namespace std;
int isOpen = 0;
MYSQL mysql; //mysql连接
MYSQL_RES* res; //一个结果集结构体
MYSQL_ROW row; //二维数组,存记录
const char DataBase_UserName[] = "root"; //数据库用户名username
const char DataBase_Password[] = "root"; //数据库密码,填自己的密码
const char DataBase_Host[] = "localhost"; //数据库连接地址
const char DataBase_Name[] = "odbc"; //database name
unsigned int DataBase_Port = 3306; //port
int ConnectDatabase(); //函数申明
void FreeConnect(); //释放资源
int AddOneInfo(const char* sql);
void GetAllInfo();
int UpdateOneInfo(const char *sql);
int DelOneInfo(const char* name);
int main()
{
isOpen=ConnectDatabase(); //连接数据库
if (isOpen)
{
GetAllInfo();
mysql_free_result(mysql_store_result(&mysql));
//添加一条信息
printf("添加\n\n");
const char *sql="insert into student values ('0121710852413', 'xiaolu','男');";
AddOneInfo(sql);
mysql_free_result(mysql_store_result(&mysql));
printf("\n");
GetAllInfo();
mysql_free_result(mysql_store_result(&mysql));
//修改一个信息
printf("修改\n");
const char* sql_update = "update student set name='whutxiaoliu' where name='xiaolu';";
UpdateOneInfo(sql_update);
printf("\n");
GetAllInfo();
mysql_free_result(mysql_store_result(&mysql));
//删除一个信息
printf("删除\n");
const char* sql_delete = "delete from student where name='xiaobao'; ";
DelOneInfo(sql_delete);
printf("\n");
GetAllInfo();
mysql_free_result(mysql_store_result(&mysql));
}
return 0;
}
//查询所有的数据
void GetAllInfo()
{
mysql_query(&mysql, "SET NAMES GBK");
mysql_free_result(mysql_store_result(&mysql));
//查询数据
mysql_query(&mysql, "SELECT * from student");
//获取结果集
res = mysql_store_result(&mysql);
//显示数据
//给ROW赋值,判断ROW是否为空,不为空就打印数据。
printf("展示所有的学生信息:\n");
while (row = mysql_fetch_row(res))
{
printf("%s ", row[0]);
printf("%s ", row[1]);
printf("%s \n", row[2]);
}
printf("\n");
}
int AddOneInfo(const char* sql)
{
if (isOpen)
{
mysql_query(&mysql, "set names gbk");
mysql_free_result(mysql_store_result(&mysql));
int res = mysql_query(&mysql, sql);
if (!res)return 1;
else
return 0;
}
else
{
printf("数据库没有打开!");
return 0;
}
return 1;
}
int UpdateOneInfo(const char* sql)
{
if (isOpen)
{
mysql_query(&mysql, "set names gbk");
mysql_free_result(mysql_store_result(&mysql));
int res = mysql_query(&mysql, sql);
if (!res)return 1;
else
return 0;
}
else
{
printf("数据库没有打开!");
return 0;
}
return 1;
}
int DelOneInfo(const char *sql) {
if (isOpen)
{
mysql_query(&mysql, "set names gbk");
mysql_free_result(mysql_store_result(&mysql));
int res = mysql_query(&mysql, sql);
if (!res)return 1;
else
return 0;
}
else
{
printf("数据库没有打开!");
return 0;
}
return 1;
}
int ConnectDatabase()
{
//初始化mysql
mysql_init(&mysql); //连接mysql,数据库jiushi
if (!(mysql_real_connect(&mysql, DataBase_Host, DataBase_UserName, DataBase_Password, DataBase_Name, DataBase_Port, NULL, 0))) //中间分别是主机,用户名,密码,数据库名,端口号(可以写默认0或者3306等),可以先写成参数再传进去
{
printf("Error connecting to database:%s\n", mysql_error(&mysql));
return 0;
}
else
{
printf("连接数据库成功!");
printf("Connected...\n");
return 1;
}
}
//释放资源
void FreeConnect()
{
//释放资源
//mysql_free_result(res);
mysql_close(&mysql);
}
我的数据库信息: