美文网首页
“老密查询”软件开发之源码教程下载(三)

“老密查询”软件开发之源码教程下载(三)

作者: 一只大蜘蛛 | 来源:发表于2020-04-29 14:25 被阅读0次

文章简介

盼星星盼月亮《老密查询软件开发系列》最后一章结束了,如果对这个“老密查询”软件敢兴趣的朋友。可以到此篇文章下面点击链接,观看 “老密查询” 编写视频教学,前俩篇相关文章 地址《“老密查询”软件开发之界面设计(一)》《“老密查询”软件开发之社工数据导入(二)》。

导入MySQL文件

”老密查询软件“因为调用MySQL数据库,所以需要导入MySQL头文件和静态库文件。文件可以在MySql的安装目录找到,注意MySQL的库一定要用win32的。如果用的是X64的库,你会发现程序会在很多人的电脑上打不开。(这就是很多人跟我反馈,之前那个老密查询软件打不开的原因)

image

包含MySQL文件

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

image

查询按钮响应代码

点击查询按钮会触发以下代码。代码主要是获取输入框的内容,再把内容从宽字节转窄字节。最后在把内容和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的,查询正常没有出现错误。

image

个人吐槽

此篇文章写的有点不明不白的,因为包含了很多的代码。也不好太详细的讲解,否则就是长篇大论了,断刀流自己看着都会恶心,更别提让你们阅读了,为了让你们更好的明白,下面我会录制个教程,请自行点击下面链接观看。

课后作业

  • 看视频教程完成软件编写
  • 下载老密查询源码完事功能

文章声明

<cite>此文章只用于技术交流学习,切勿用作非法用途,否则后果自负。</cite>

相关文章

网友评论

      本文标题:“老密查询”软件开发之源码教程下载(三)

      本文链接:https://www.haomeiwen.com/subject/csggwhtx.html