//////////////////2015/07/22///////////////////
/////////////////by xbw /////////////////////////
////////////////环境 VS2013/////////////////
为了登陆界面的注册用的数据库鼓捣的一天了,必须得写篇文章发泄一下了,
昨天发表的文章还是存在一点bug的,不足之处很容易就看出来了,这样的,今天有修改了一下,是大改哦
int first = 1; while (!Dbset.IsEOF()) // 有没有到表结尾 { Dbset.GetFieldValue(_T("Name"), var); Sname = (LPCSTR)var.pbstrVal; Dbset.GetFieldValue(_T("Psw"), var); Spsw = (LPCSTR)var.pbstrVal; Dbset.GetFieldValue(_T("Score"), var); Sscore = (LPCSTR)var.pbstrVal; if (Sname.Compare(m_logname) == 0 && Spsw.Compare(m_logpsw) == 0)//如果密码和账户与数据库一致 { MessageBox(_T("登入成功!"), _T("温情提示")); CDialog::OnOK(); first = 0; break; } else { Dbset.MoveNext(); } } if (first) { MessageBox(_T("用户或密码错误!"), _T("温情提示")); }
这就是修改的地方,资料查了半天,才知道MFC调用数据库有这么多方法,这个呢是适合我的,
因为我的定义是
CDaoDatabase db; //数据库
CDaoRecordset RecSet(&db); //记录集
头文件 #include "afxdao.h"
唉,不多说了,直接上完整代码,贴出来好心疼,大家互相交流学习吧,,,,,,
// loading.cpp : 实现文件 // #include "stdafx.h" #include "PlaneGame.h" #include "loading.h" #include "afxdialogex.h" #include "afxdao.h" #include "zhuce.h" // loading 对话框 IMPLEMENT_DYNAMIC(loading, CDialogEx) CDaoDatabase db; //数据库 CDaoRecordset RecSet(&db); //记录集 loading::loading(CWnd* pParent /*=NULL*/) : CDialogEx(loading::IDD, pParent) , open(false) , open1(false) , m_logname(_T("")) , m_logpsw(_T("")) { CString Filepath = _T("Database.mdb"); CDaoRecordset Dbset(&db); CFileFind Ffind; BOOL flag = Ffind.FindFile(Filepath); Ffind.Close(); if (!flag) { CString sqlcmd = _T("CREATE TABLE DataTable(Name VARCHAR(20),Psw VARCHAR(20),Score VARCHAR(20))"); db.Create(Filepath); db.Execute(sqlcmd); Dbset.Open(AFX_DAO_USE_DEFAULT_TYPE, _T("SELECT * FROM DataTable", 0)); Dbset.AddNew(); Dbset.SetFieldValue(_T("Name"), _variant_t(_T("plucky"))); Dbset.SetFieldValue(_T("Psw"), _variant_t(_T("MFC_py")));//设置初始用户名和密码 Dbset.SetFieldValue(_T("Score"), _variant_t(_T("0"))); Dbset.Update(); Dbset.Close(); db.Close(); }//这样就创建好了数据库文件,而且设置了初始化账号 } loading::~loading() { } void loading::DoDataExchange(CDataExchange* pDX) { DDX_Text(pDX, IDC_EDIT3, m_logname); DDX_Text(pDX, IDC_EDIT4, m_logpsw); } BEGIN_MESSAGE_MAP(loading, CDialogEx) ON_WM_NCHITTEST() ON_WM_CTLCOLOR() ON_BN_CLICKED(IDCANCEL, &loading::OnBnClickedCancel) ON_BN_CLICKED(IDOK, &loading::OnBnClickedOk) ON_BN_CLICKED(IDOK2, &loading::OnBnClickedOk2) ON_NOTIFY(NM_CLICK, IDC_SYSLINK1, &loading::OnNMClickSyslink1) ON_NOTIFY(NM_CLICK, IDC_SYSLINK2, &loading::OnNMClickSyslink2) END_MESSAGE_MAP() // loading 消息处理程序 //鼠标拖动窗口移动 //CDaoDatabase db; //数据库 //CDaoRecordset RecSet(&db); //记录集 LRESULT loading::OnNcHitTest(CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 ScreenToClient(&point); CRect rc; GetClientRect(&rc); if (rc.PtInRect(point)) { return HTCAPTION; } else { return CDialogEx::OnNcHitTest(point); } } HBRUSH loading::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { //HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor); //CFont font; //font.CreatePointFont(200, _T("宋体"), NULL); //GetDlgItem(IDC_STATIC)->SetFont(&font); // TODO: 在此更改 DC 的任何特性 //在OnInitDialog()函数中添加: // TODO: 在此添加额外的初始化代 if (nCtlColor == CTLCOLOR_STATIC) { pDC->SetTextColor(RGB(200, 100, 50)); pDC->SetBkMode(RGB(200, 100, 50)); //设置背景透明 return HBRUSH(GetStockObject(HOLLOW_BRUSH)); } // TODO: 如果默认的不是所需画笔,则返回另一个画笔 //return hbr; return 0; } void loading::OnBnClickedCancel() { // TODO: 在此添加控件通知处理程序代码 open = FALSE; CDialogEx::OnCancel(); } void loading::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 // CString Filepath = _T("Database.mdb"); // CDaoRecordset Dbset(&db); // CFileFind Ffind; // BOOL flag = Ffind.FindFile(Filepath); // Ffind.Close(); /*if (!flag) { CString sqlcmd = _T("CREATE TABLE DataTable(Name VARCHAR(20),Psw VARCHAR(20),Score VARCHAR(20))"); db.Create(Filepath); db.Execute(sqlcmd); Dbset.Open(AFX_DAO_USE_DEFAULT_TYPE, _T("SELECT * FROM DataTable", 0)); Dbset.AddNew(); Dbset.SetFieldValue(_T("Name"), _variant_t(_T("plucky"))); Dbset.SetFieldValue(_T("Psw"), _variant_t(_T("MFC_py")));//设置初始用户名和密码 Dbset.SetFieldValue(_T("Score"), _variant_t(_T("0"))); Dbset.Update(); Dbset.Close(); db.Close(); }//这样就创建好了数据库文件,而且设置了初始化账号*/ /*CString sPath; GetModuleFileName(NULL, sPath.GetBufferSetLength(MAX_PATH + 1), MAX_PATH); sPath.ReleaseBuffer(); int nPos; nPos = sPath.ReverseFind('\\'); sPath = sPath.Left(nPos); CString strFile = sPath + _T("\\Database.mdb"); db.Open(strFile); // 打开已创建的demo数据库及DemoTable表 RecSet.Open(AFX_DAO_USE_DEFAULT_TYPE, _T("SELECT* FROM DataTable"), NULL);*/ //UpdateData(TRUE); //CString m_tablefield, m_searchSQL; //if (m_sfield.Compare("姓名") == 0) //{ // m_tablefield.Format("Name"); //} /*UpdateData(true); CDaoRecordset Dbset(&db); CString Filepath =_T( "Database.mdb"); CString Sname, Spsw,Sscore; _variant_t varname, varpsw,varscore; db.Open(Filepath); Dbset.Open(AFX_DAO_USE_DEFAULT_TYPE, _T("SELECT * FROM DataTable"), 0); varname = Dbset.GetFieldValue(_T("Name")); varpsw = Dbset.GetFieldValue(_T("Psw")); varscore = Dbset.GetFieldValue(_T("Score")); Sname = (LPCSTR)_bstr_t(varname); Spsw = (LPCSTR)_bstr_t(varpsw); Sscore = (LPCSTR)_bstr_t(varscore); Dbset.Close(); db.Close(); if (Sname.Compare(m_logname)==0&&Spsw.Compare(m_logpsw) == 0)//如果密码和账户与数据库一致 { MessageBox(_T("登入成功!"), _T("温情提示")); CDialog::OnOK(); } else { MessageBox(_T("用户或密码错误!"), _T("温情提示")); return; }*/ UpdateData(true); COleVariant var; // 字段类型 var.ChangeType(VT_BSTR, NULL); //CString strName, strAge, strFile; CString Sname, Spsw, Sscore; CDaoRecordset Dbset(&db); CString Filepath = _T("Database.mdb"); db.Open(Filepath); Dbset.Open(AFX_DAO_USE_DEFAULT_TYPE, _T("SELECT * FROM DataTable"), 0); int first = 1; while (!Dbset.IsEOF()) // 有没有到表结尾 { Dbset.GetFieldValue(_T("Name"), var); Sname = (LPCSTR)var.pbstrVal; Dbset.GetFieldValue(_T("Psw"), var); Spsw = (LPCSTR)var.pbstrVal; Dbset.GetFieldValue(_T("Score"), var); Sscore = (LPCSTR)var.pbstrVal; if (Sname.Compare(m_logname) == 0 && Spsw.Compare(m_logpsw) == 0)//如果密码和账户与数据库一致 { MessageBox(_T("登入成功!"), _T("温情提示")); CDialog::OnOK(); first = 0; break; } else { Dbset.MoveNext(); } } if (first) { MessageBox(_T("用户或密码错误!"), _T("温情提示")); } db.Close(); Dbset.Close(); /*UINT nIndex = 0; CString TempStr; COleVariant OleVariant; // 删除列表控件所有记录 BookList.DeleteAllItems(); // 定义记录集对象,并打开记录集 CDaoRecordset Record(&db); Record.Open(dbOpenDynaset, L"SELECT * FROM BOOK"); // 移动到第一条记录 Record.MoveFirst(); while (!Record.IsEOF()) { // 在列表控件添加记录 TempStr.Format(L"%d", nIndex + 1); this->BookList.InsertItem(nIndex, TempStr); for (int i = 1; i <= 3; i++) { Record.GetFieldValue(i, OleVariant); this->BookList.SetItemText(nIndex, i, OleVariant.bstrVal); } Record.GetFieldValue(4, OleVariant); TempStr.Format(L"%d", OleVariant.uintVal); this->BookList.SetItemText(nIndex, 4, TempStr); // 移到下一条记录Record.MoveNext () ;nIndex++ ; } // 关闭记录集 Record.Close();*/ } void loading::OnBnClickedOk2() { open1 = FALSE; // TODO: 在此添加控件通知处理程序代码 } void loading::OnNMClickSyslink1(NMHDR *pNMHDR, LRESULT *pResult) { // TODO: 在此添加控件通知处理程序代码 zhuce dlg; //opening = TRUE; if (dlg.DoModal() == IDOK) { Invalidate(); } *pResult = 0; } void loading::OnNMClickSyslink2(NMHDR *pNMHDR, LRESULT *pResult) { // TODO: 在此添加控件通知处理程序代码 MessageBox(_T("暂无此功能,请联系开发者"), _T("温情提示")); *pResult = 0; }
中间太多注释的部分,因为改了又改,不怕辛苦,弄出来了真的很开心,,,,,,给你们分享了;
这个注册部分呢也修改了;;;
直接上代码吧;;;;
// zhuce.cpp : 实现文件 // #include "stdafx.h" #include "PlaneGame.h" #include "zhuce.h" #include "afxdialogex.h" #include "afxdao.h" // zhuce 对话框 IMPLEMENT_DYNAMIC(zhuce, CDialogEx) zhuce::zhuce(CWnd* pParent /*=NULL*/) : CDialogEx(zhuce::IDD, pParent) , m_regname(_T("")) , m_regpsw(_T("")) { } zhuce::~zhuce() { } void zhuce::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, m_regname); DDX_Text(pDX, IDC_EDIT2, m_regpsw); } BEGIN_MESSAGE_MAP(zhuce, CDialogEx) ON_BN_CLICKED(IDC_BUTTON1, &zhuce::OnBnClickedButton1) ON_BN_CLICKED(IDOK, &zhuce::OnBnClickedOk) END_MESSAGE_MAP() // zhuce 消息处理程序 void zhuce::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 UpdateData(true);//上一次视频里已经讲过,续及时更新数据 CString Filepath = _T("Database.mdb"); //CString Sname; CDaoDatabase db; // _variant_t varname; CDaoRecordset Dbset(&db); db.Open(Filepath); Dbset.Open(AFX_DAO_USE_DEFAULT_TYPE, _T("SELECT * FROM DataTable"), 0); //varname = Dbset.GetFieldValue(_T("Name")); //Sname = (LPCSTR)_bstr_t(varname); if (m_regname.IsEmpty() || m_regpsw.IsEmpty()) { MessageBox(_T("信息不能为空!"), _T("温情提示")); } else { CString Sname; COleVariant var; // 字段类型 var.ChangeType(VT_BSTR, NULL); int first = 1; while (!Dbset.IsEOF()) // 有没有到表结尾 { Dbset.GetFieldValue(_T("Name"), var); Sname = (LPCSTR)var.pbstrVal; if (Sname.Compare(m_regname) == 0)//如果密码和账户与数据库一致 { MessageBox(_T("该用户已存在!"), _T("温情提示")); CDialog::OnOK(); first = 0; //break; } else { Dbset.MoveNext(); } } if (first) { Dbset.MoveLast(); //Dbset.Edit();//因为表里只允许有一个数据,所以就将新数据代替旧数据 Dbset.AddNew(); Dbset.SetFieldValue(_T("Name"), _variant_t(m_regname)); Dbset.SetFieldValue(_T("Psw"), _variant_t(m_regpsw)); Dbset.SetFieldValue(_T("Score"), _variant_t(_T("0"))); Dbset.Update(); MessageBox(_T("用户注册成功!"), _T("温情提示")); } } Dbset.Close(); db.Close(); } void zhuce::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 CDialogEx::OnOK(); }
这段代码让我哭笑不得,,出了个bug,在群里跟别人分享都说这要是加上开机自动启动就无敌了,其实没这么可怕,只是死循环,一直显示该用户已存在,避免这个的方法是什么清楚吧,就是不要重复注册,开玩笑了,你只要把break那个地方取消注释就好了,千万不要乱用哦,要维护好网络安全哦;;;;;;
好了,我也是个渣渣,只能整理资料,并不能讲的很透彻,,,,,,制作登陆账号注册的可以试试此代码;;;不错的哦;;;
累死咯,不玩了,,,,接下来弄一下MFC套接字,争取把数据放到服务器上,用客户端调用服务器注册,,,,,
有懂的给我留言吧,谢谢啦;;;;