第二次作业
流程图


以上是利用MFC制作的登录界面。
若账号密码输入错误会弹出如下界面:

若账号密码输入正确,则会弹出如下窗口:

计算器页面:

点击“=”按钮后会出现计算结果并将此次计算记录保存在Mysql数据库

以下是创建的数据库:

MFC连接Mysql数据库的方法:
1.把配置属性的 “ 环境 ” 填写为你系统安装 mysql 的路径下的 bin 文件夹,即“C:\Program Files\MySQL\MySQL Server 5.7\bin;”,

2. 在你安装 mysql 的文件夹中,找到 “ lib ” 文件夹下的 “ libmysql.lib ” 和 “ libmysql.dll ”,复制这两个文件到创建 MFC 程序的同级目录下,还有在它里面也要放
3.修改 “ VC++ 目录 ”中的 包含目录、 引用目录、 库目录,其路径分别是你系统里安装 mysql 路径的 include、lib、lib 文件夹。\n\n再修改 “ C/C++ ” 的常规,和 “ 链接器 ” 的常规和输入,见图
修改 “ VC++ 目录 ”中的 包含目录、 引用目录、 库目录,其路径分别是你系统里安装 mysql 路径的 包括、库、库文件夹。\n
再修改 “ C/C++ ” 的常规,和 " 链接器 " 的常规和输入,见图



以下是使用数据库保留的历史计算记录:

本计算器利用MFC框架,框架自带函数不予展示,下面是主要代码:
代码:
void CMFCComputerDlg::SaveMySql(CString text)
{
const char user[] = "root"; //填写你的 mysql 用户名
const char pswd[] = "20030617"; //填写你的 mysql 密码
const char host[] = "localhost";
const char database[] = "abc"; //填写你的 mysql 数据库名称
unsigned int port = 3306;
MYSQL_RES* res;
MYSQL_ROW row;
MYSQL mysqlCon;
mysql_init(&mysqlCon);
if (!mysql_real_connect(&mysqlCon, host, user, pswd, database, port, NULL, 0))
{
AfxMessageBox(_T("访问数据库失败!"));
}
else
{
mysql_query(&mysqlCon, "SET NAMES GBK"); //设置字符集,确保能够插入中文数据
// 插入数据的 SQL 语句(假设 computer 表有 text 列)
CStringW sql;
sql.Format(_T("INSERT INTO wyq (text) VALUES ('%s')"), text);
AfxMessageBox(sql);
LPCWSTR sqlW = sql.GetString();
int size_needed = WideCharToMultiByte(CP_UTF8, 0, sqlW, -1, NULL, 0, NULL, NULL); // 计算所需的缓冲区大小
char* sql_char = new char[size_needed];
WideCharToMultiByte(CP_UTF8, 0, sqlW, -1, sql_char, size_needed, NULL, NULL); // 将宽字符转换为多字节字符
//AfxMessageBox(_T(sql_char));
if (mysql_query(&mysqlCon, sql_char) == 0)
{
AfxMessageBox(_T("插入成功!"));
}
else
{
AfxMessageBox(_T("插入失败!"));
}
}
mysql_close(&mysqlCon);
}
void CMFCApplication2Dlg::OnBnClickedButton2()
{
// Login Button
//CDialogEx::OnOK();
GetDlgItem(IDC_EDIT1)->GetWindowText(name); //获得输入的用户名
GetDlgItem(IDC_EDIT2)->GetWindowText(password); //获得输入的密码
const char user[] = "root"; //填写你的 mysql 用户名
const char pswd[] = "20030617"; //填写你的 mysql 密码
const char host[] = "localhost";
const char database[] = "abc"; //填写你的 mysql 数据库名称
unsigned int port = 3306;
MYSQL_RES* res;
MYSQL_ROW row;
MYSQL mysqlCon;
if (name.IsEmpty() || password.IsEmpty())
{
MessageBox(_T("用户名或密码不能为空!"), _T("用户登录信息"));
return;
}
mysql_init( &mysqlCon);
if (!mysql_real_connect(&mysqlCon, host, user, pswd, database, port, NULL, 0))
{
AfxMessageBox(_T("访问数据库失败!"));
}
else
{
mysql_query(&mysqlCon, "SET USER GBK"); //设置字符集
AfxMessageBox(_T("访问数据库成功!"));
}
//mysql_query(&myCont, "SET NAMES GBK"); //设置编码格式,否则在cmd下无法显示中文
// 如果你的用户名是中文,加上上面这句;
int ress = mysql_query(&mysqlCon, "select username, password from wx");
if (ress == 0) //检测查询成功为0,不成功则非0
{
res = mysql_store_result(&mysqlCon); //保存查询到的数据到 res
if (mysql_num_rows(res) == 0) //查询结果为空
{
AfxMessageBox(_T("用户不存在"));
}
else
{
row = mysql_fetch_row(res);
if (password == row[1])
{
mysql_free_result(res);
MessageBox(_T("登录成功!"));
}
else
{
AfxMessageBox(_T("密码错误!"));
}
}
}
else
{
AfxMessageBox(_T("访问失败!"));
}
mysql_close(&mysqlCon);
}
void CMFCComputerDlg::SaveMySql(CString text)
{
const char user[] = "root"; //填写你的 mysql 用户名
const char pswd[] = "20030617"; //填写你的 mysql 密码
const char host[] = "localhost";
const char database[] = "abc"; //填写你的 mysql 数据库名称
unsigned int port = 3306;
MYSQL_RES* res;
MYSQL_ROW row;
MYSQL mysqlCon;
mysql_init(&mysqlCon);
if (!mysql_real_connect(&mysqlCon, host, user, pswd, database, port, NULL, 0))
{
AfxMessageBox(_T("访问数据库失败!"));
}
else
{
mysql_query(&mysqlCon, "SET NAMES GBK"); //设置字符集,确保能够插入中文数据
// 插入数据的 SQL 语句(假设 computer 表有 text 列)
CStringW sql;
sql.Format(_T("INSERT INTO wx (name) VALUES ('%s')"), text);
AfxMessageBox(sql);
LPCWSTR sqlW = sql.GetString();
int size_needed = WideCharToMultiByte(CP_UTF8, 0, sqlW, -1, NULL, 0, NULL, NULL); // 计算所需的缓冲区大小
char* sql_char = new char[size_needed];
WideCharToMultiByte(CP_UTF8, 0, sqlW, -1, sql_char, size_needed, NULL, NULL); // 将宽字符转换为多字节字符
//AfxMessageBox(_T(sql_char));
if (mysql_query(&mysqlCon, sql_char) == 0)
{
AfxMessageBox(_T("插入成功!"));
}
else
{
AfxMessageBox(_T("插入失败!"));
}
}
mysql_close(&mysqlCon);
}
浙公网安备 33010602011771号