“老密查询”软件开发之源码教程下载(三)
文章简介
盼星星盼月亮《老密查询软件开发系列》最后一章结束了,如果对这个“老密查询”软件敢兴趣的朋友。可以到此篇文章下面点击链接,观看 “老密查询” 编写视频教学,前俩篇相关文章 地址《“老密查询”软件开发之界面设计(一)》《“老密查询”软件开发之社工数据导入(二)》。
导入MySQL文件
”老密查询软件“因为调用MySQL数据库,所以需要导入MySQL头文件和静态库文件。文件可以在MySql的安装目录找到,注意MySQL的库一定要用win32的。如果用的是X64的库,你会发现程序会在很多人的电脑上打不开。(这就是很多人跟我反馈,之前那个老密查询软件打不开的原因)

包含MySQL文件
MySQL的include文件夹和libmysql.lib文件,放到”老密查询软件“项目的当前目录下。然后到VS里面右击项目的名称,弹出菜单选项-->属性-->c/c++-->常规-->附加包含目录,选择include文件夹的路径。接着点击链接器-->输入-->附加依赖项,填上静态文件的名称。然后在项目下的QueryDlg.h文件中,添加 include “mysql.h”这句代码包含头文件。

查询按钮响应代码
点击查询按钮会触发以下代码。代码主要是获取输入框的内容,再把内容从宽字节转窄字节。最后在把内容和SQL查询语句组装起来,组装成SQL查询语句以后,再把组装好的SQL查询语句传给,新创建的线程去执行查询操作。
void CQueryDlg::OnBnClickedButton1()
{
USES_CONVERSION;
CString strText, list_text;
GetDlgItem(IDC_BUTTON1)->EnableWindow(false); //禁用查询按钮
GetDlgItem(IDC_EDIT1)->GetWindowText(strText); //获取查询内容
if (strText == "")
{
::MessageBox(NULL, _T(" 请输入需要查询的数据后\n 在点击开始查询!"), _T("危险提示"), MB_OK);
return;
}
m_NoStop = true;
int iRadioButton = GetCheckedRadioButton(IDC_RADIO1, IDC_RADIO2);//获取选择的是精准查询还是模糊查询
switch (iRadioButton)
{
case IDC_RADIO1:
{
CString mble;
mble.Format(_T(" WHERE user = \'%s\';"), strText);
string temp = UnicodeToUtf8(mble); //宽字节转窄字节
if (temp.empty())
return;
m_Assemble = "SELECT * FROM qqdata" + temp;
break;
}
case IDC_RADIO2:
{
CString mble;
mble.Format(_T(" WHERE user REGEXP \'%s\';"), strText);
string temp = UnicodeToUtf8(mble); //宽字节转窄字节
if (temp.empty())
return;
m_Assemble = "SELECT * FROM qqdata " + temp;
break;
}
}
if (m_Assemble.empty())
return;
DWORD threadId;
m_hThread = CreateThread(NULL, 0, QueryThread, this, 0, &threadId); // 创建线程
//::MessageBox(NULL, _T(" 已经开始在数据库中查询\n 请客官骚等片刻!"), _T("提示信息:"), MB_OK);
}
查询线程
查询线程启动后,会首先连接数据库,连接成功后会让MySQL数据库执行组装好的SQL查询语句。再把查询结果返回存放到结果集里面,最后在通过while循环依次插入到列表中。插入完成会首先释放查询 结果集,在关闭MySQL数据库的连接句柄。
DWORD WINAPI QueryThread(LPVOID pParam)
{ // 线程执行的代码。
CQueryDlg *pclass = (CQueryDlg*)pParam;
if (!pclass->LinkStatus())
{
return false;
}
int num = pclass->m_mysql.Query(pclass->m_Assemble.c_str());
if (!num)
return false;
int lie = mysql_num_fields(pclass->m_mysql.result);
CString temp; int i = 0, c = 0;
while ((pclass->m_mysql.row = mysql_fetch_row(pclass->m_mysql.result)) && pclass->m_NoStop)
{
pclass->m_list.InsertItem(0, NULL); //插入行
for (int i = 0; i < lie; i++) //利用for循环,输出该行的每一列
{
temp.Format(L"%s", (CString)pclass->m_mysql.row[i]);// = Utf8ToUnicode(); //row是MYSQL_ROW变量,可以当做数组使用,i为列数
pclass->m_list.SetItemText(0, i, temp); //设置列标题
}
c++;
}
CString msg;
msg.Format(_T(" 本次数据查询完毕!\n 总共查询到%d条数据!"), c);
::MessageBox(NULL, msg, _T("提示信息:"), MB_OK);
mysql_free_result(pclass->m_mysql.result); //释放结果集所占用的内存
if (pclass->m_mysql.MySQL_SOCK != NULL)
{
mysql_close(pclass->m_mysql.MySQL_SOCK);
}
pclass->m_mysql.MySQL_SOCK = NULL;
pclass->m_QueryBtn.EnableWindow(true);
return true;
}
查询效果演示
下面使用模糊查询做演示,查询账号中包含1003的账号。查询完成花费时间在1秒以内,因为需要把数据插入到列表中,总共花费了2秒的时间。其中查询出来 130条包含1003的账号,账号这一列也都是包含关键词1003的,查询正常没有出现错误。

个人吐槽
此篇文章写的有点不明不白的,因为包含了很多的代码。也不好太详细的讲解,否则就是长篇大论了,断刀流自己看着都会恶心,更别提让你们阅读了,为了让你们更好的明白,下面我会录制个教程,请自行点击下面链接观看。
课后作业
- 看视频教程完成软件编写
- 下载老密查询源码完事功能
文章声明
<cite>此文章只用于技术交流学习,切勿用作非法用途,否则后果自负。</cite>