一、前言
1、系统环境:Window10,visual studio 2022,MYSQL Client(MariaDB 5.5(X64))。
2、界面:这是一个MFC界面,通过连接创建的数据库,实现计算器登录、运算以及查看历史记录的功能。
二、设计过程
1、流程图:
2、数据库表格创建与连接
(1)创建用户表“yunzhou”:
(2)创建历史记录表“yunzhou1”:
(3)连接mysql数据库:
①把配置属性的“环境”填写为系统安装mysql的路径下的bin文件夹,即“PATH=D:\mysql\mysql-8.0.23-winx64\bin;”。
②在安装mysql的文件夹中,找到“lib”文件夹下的“libmysql.lib”和“libmysql.dll”,复制这两个文件到创建MFC程序的同级目录下。
③修改“VC++目录”中的 包含目录、引用目录、库目录,其路径分别是你系统里安装mysql路径的include、lib、lib文件夹。
再修改“C/C++”的常规,和 “链接器”的常规和输入,见图。
3、计算器界面设计:
(1):通过 visual studio 2022 下的MFC进行视图设计如下;
(2):对各个编辑框进行属性定义,实现相关功能。
注:进行属性定义,功能实现时,由于MFC框架下的C++语言自定义代码由系统生成,现展示关键代码如下.
①:登录功能
void CwuzhoujsqDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 // Login Button //CDialogEx::OnOK(); GetDlgItem(IDC_EDIT1)->GetWindowText(username); //获得输入的用户名 GetDlgItem(IDC_EDIT2)->GetWindowText(password); //获得输入的密码 const char user[] = "root"; //填写你的 mysql 用户名 const char pswd[] = "123456"; //填写你的 mysql 密码 const char host[] = "localhost"; const char database[] = "test"; //填写你的 mysql 数据库名称 unsigned int port = 3306; MYSQL_RES* res; MYSQL_ROW row; MYSQL mysqlCon; if (username.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("访问数据库成功!")); } int ress = mysql_query(& mysqlCon, "select*from yunzhou"); 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("已上线!"),L"提示",MB_OK); } else { AfxMessageBox(_T("密码错误!")); } } } else { AfxMessageBox(_T("访问失败!")); } mysql_close(& mysqlCon); }
计算器登录过程如下:
②计算功能:
void CwuzhoujsqDlg::Calculator() { UpdateData(TRUE); mNum2 = _wtof(mStr); double result = 0.0f; switch (mFlag) { case FLAG_JIA: result = mNum1 + mNum2; mTempStr = mTempStr + _T("+") + mStr + _T("="); break; case FLAG_JIAN: result = mNum1 - mNum2; mTempStr = mTempStr + _T("-") + mStr + _T("="); break; case FLAG_CHENG: result = mNum1 * mNum2; mTempStr = mTempStr + _T("*") + mStr + _T("="); break; case FLAG_CHU: if (mNum2 == 0) { mTempStr = _T("出0错误"); } else { result = mNum1 / mNum2; mTempStr = mTempStr + _T("/") + mStr + _T("="); } break; default: break; } if (result - (int)result <= 1e-5) { mStr.Format(L"%d", (int)result); } else { mStr.Format(L"%f", result); } mTempStr += mStr;//计算记录在mTempStr中 //SaveMySql(mTempStr); //UpdateData(FALSE); mNum1 = 0.0f; mNum2 = 0.0f; SaveMySql(mTempStr); }
计算过程如下:
③历史记录插入:
void CwuzhoujsqDlg::SaveMySql(CString text) { const char user[] = "root"; //填写你的 mysql 用户名 const char pswd[] = "123456"; //填写你的 mysql 密码 const char host[] = "localhost"; const char database[] = "test"; //填写你的 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"); //设置字符集,确保能够插入中文数据 CStringW sql; sql.Format(_T("INSERT INTO yunzhou1 (test) 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); // 将宽字符转换为多字节字符 CString str(sql_char); MessageBox(str); if (mysql_query(&mysqlCon, sql_char) == 0) { AfxMessageBox(_T("插入成功!")); } else { AfxMessageBox(_T("插入失败!")); } } mysql_close(&mysqlCon); }
插入过程如下:
mysql数据库中历史记录保存查询如下:
标签:MFC,mTempStr,AfxMessageBox,char,visual,studio,result,mysqlCon,mysql From: https://www.cnblogs.com/lzufe-wjh/p/17873869.html