注:因为第一次写博客,所以可能有点啰嗦。
前言:
简单学过c++和数据库原理但是随着时间已经忘记了不少东西,这是我重新学习起C++和MYSQL的第一个小项目,因为有点懒没有把函数声明放到头文件里,创建的类没怎么使用,重复的局部变量和函数有点多,有些东西也弄得比较繁琐,另外内存分配和资源释放可能也做的不够好。
因为只是简单的重新学习了C++和SQL语句,里面用到的内容都比较简单,新手入门可以看看。如果还有其他不足,如编程习惯和规范不足等需要改进的东西,希望大佬们指正,谢谢。
背景:
简单重新学习C++后发现想链接MYSQL做个小程序,因为之前没有做过。设想是将一个预设格式的配置文本文件 Student1.txt 的内容读入, 在创建表之后将文本里的内容读入数据库。然后在VC里实现数据库的增删改查, 最终在按0退出程序的时候(按打叉退出不会保存),将数据库的操作完成之后的数据存入另外一个文件 Student2.txt 中。(未保存进入原文件,有怕使文件数据丢失损坏的成分)
追加:MySQL的配置和安装方法CSDN 上面有很多,所以我就不多说了,本来想做一个傻瓜攻略把MySQL的配置也一起讲了的,但是发现有点没那个精力。
值得注意的:
1.环境变量的添加
2.MySQL与Visual Studio连接时包含目录和库目录等
3.配置的时候看好自己安装的MySQL位数,要和VS配置设置时位数保持一致,编译调试时也要使用相同位数
4.MYSQL.h和定义MySQL 结构体时很多东西都要大写,否则编译器可能不认识。(这点最容易吃亏的是全体注释之后取消注释的时候ctrl+U会同时把大写的MYSQL变成小写,如果经常使用全体注释建议吧ctrl+U的变小写给他去掉)
代码部分:
1.主要函数:
void ShowMean(); // 菜单功能
bool ConnectMysql(MYSQL& mysql); // 连接数据库
//void Read(MYSQL& mysql); // 将数据读入并显示
void Query(MYSQL& mysql); // 查询学生数据
void Modify(MYSQL& mysql); // 修改学生数据
void Insert(MYSQL& mysql);// 添加学生信息
void Delete(MYSQL& mysql); // 删除学生数据
void FileIn(MYSQL& mysql); // 读入文本文件并建立数据库内对应表格,并插入文本之中 的数据
int getLine();// 获取文本文件的行数,用以确定建表插入的数据数量
void FileOut(MYSQL& mysql); // 将数据库中文件另行输出到另一个文本文件以备份数据
void createTable(MYSQL& mysql);
2.主函数实现:
根据用户选项进行各个函数的调用,且每次操作完成之后会进行一个界面的清空,让人看着更加舒服。
int main()
{
MYSQL mysql; // 创建数据库结构体
mysql_init(&mysql); //初始化数据库
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk"); // 设定数据库字符集
int choice = 1;
if (ConnectMysql(mysql) == false)
{
return 0;
}
else
while (choice != 0) {
ShowMean();
cin >> choice;
switch (choice) {
case 1:
FileIn(mysql); break;
case 2:
Query(mysql); break;
case 3:
Modify(mysql); break;
case 4:
Insert(mysql); break;
case 5:
Delete(mysql); break;
case 0:
FileOut(mysql); exit(0);
default:
cout << "您的输入有误,请重新输入" << endl; break;
}
cout << endl << "操作已完成" << endl;
system("pause");
system("cls");
}
mysql_close(&mysql);
system("pause");
return 0;
}
3.部分实现:
(1)创建表
其实这里可以同时创建一个数据库,但是我没有实现,只要把后边增删改查的指令改成SQL 语句的创建数据库应该就可以实现,有兴趣的可以自己的去实现。重要的一点是创建表的时候要同时设置表的字符集格式,避免汉字乱码。但是两天前我同样设置了字符集但是还是乱码,但是后面不知道怎么回事就突然好了,挺离谱的。
void createTable(MYSQL& mysql) {
// 字符数组内容为MYSQL语句 创建表格
// 记住此处 ` 不是单引号 ' 否则无法创建表格
char Quest[] = "CREATE TABLE IF NOT EXISTS `Student1`(\
`Id` int AUTO_INCREMENT,\
`name` varchar(20),\
`score` double,\
PRIMARY KEY (`Id`)\
)ENGINE=InnoDB DEFAULT CHARSET=utf8;"; // 设定表的字符集,避免汉字乱码
//mysql_query(&mysql, "SET CHARACTER SET GBK");
int re = mysql_query(&mysql, Quest);
if (re == 0)
cout << "表格已经创建" << endl;
}
(2)连接数据库
个人认为这部分很重要,尽可能了解连接的语句,很重要的基础
bool ConnectMysql(MYSQL& mysql) {
const char db_Username[] = "root"; // 数据库用户名
const char db_Password[] = "0927"; // 相应的密码
const char db_Host[] = "localhost"; // 数据库连接地址
const char db_Name[] = "sp"; // 数据库名字
unsigned long db_Port = 3306; // 端口号 *此处应注意端口号数据类型和其他四个不同
mysql_init(&mysql); // mysql的API接口,用以初始化数据库
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk"); // 将数据库字符集设置为gbk,以避免中文乱码
//开始连接数据并判断是否连接成功;
if (mysql_real_connect(&mysql, db_Host, db_Username, db_Password, db_Name, db_Port, NULL, 0) == NULL)
{
cout << "连接数据库失败,请检查数据是否正确" << endl;
return false;
}
cout << "连接成功" << endl;
createTable(mysql);
return true;
}
(3)查询函数
这里有个遗憾就是没能完成一个查不到就告诉用户没有相关学生,还有增删改查共同的遗憾,输入SQL语句进行增删改查,我也没去实现,从实现的可能性和难度上来说应该是有可能简单实现的。
void Query(MYSQL& mysql) // 查询学生数据
{
MYSQL_RES* res; // 创建一个结果集
MYSQL_ROW row; // 二维数组存放记录
cout << "您选择了查询学生信息" << endl;
cout << "请输入您要查询的选项" << endl;
cout << "\t 1. 查询全部学生" << endl;
cout << "\t 2. 按学号查询" << endl;
cout << "\t 3. 按照名字进行查询" << endl;
cout << "\t 4. 按照分数进行查询" << endl;
//cout << "\t 5.自定义SQL