MFC + Access 用户验证程序(初级数据库编程)
转自:企业即时通讯
软件流程: 弹出对话框,要求输入用户及密码,正确则跳到主对话框,错误则要求重新输入,关闭则什么也不做退出。 三无程序,有用的或刚学ADO的看看。
// stdafx.h
// stdafx.h : include file for standard system include files, // or project specific include files that are used frequently, but // are changed infrequently //
#if !defined(AFX_STDAFX_H__B170E8A6_57B5_4B19_A471_C368C30871F1__INCLUDED_) #define AFX_STDAFX_H__B170E8A6_57B5_4B19_A471_C368C30871F1__INCLUDED_
#if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000
#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
#include <afxwin.h> // MFC core and standard components #include <afxext.h> // MFC extensions #include <afxdisp.h> // MFC Automation classes #include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls #ifndef _AFX_NO_AFXCMN_SUPPORT #include <afxcmn.h> // MFC support for Windows Common Controls #endif // _AFX_NO_AFXCMN_SUPPORT
#include <icrsint.h> #import "c:/program files/common files/system/ado/msado15.dll" no_namespace rename("EOF","adoEOF")
//{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_STDAFX_H__B170E8A6_57B5_4B19_A471_C368C30871F1__INCLUDED_) ---------------------------------------------------------------------------------------------------------------------------------------------------
#if !defined(AFX_LOGINDLG_H__C757DD49_652B_41A1_84C3_EC0D3C40A07F__INCLUDED_) #define AFX_LOGINDLG_H__C757DD49_652B_41A1_84C3_EC0D3C40A07F__INCLUDED_
#if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // LoginDlg.h : header file //
/ // CLoginDlg dialog
class CLoginDlg : public CDialog { // Construction public: BOOL UserValid(); CLoginDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data //{{AFX_DATA(CLoginDlg) enum { IDD = IDD_DIALOG1 }; // NOTE: the ClassWizard will add data members here //}}AFX_DATA
// Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CLoginDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL
// Implementation protected:
// Generated message map functions //{{AFX_MSG(CLoginDlg) virtual void OnOK(); virtual void OnCancel(); virtual BOOL OnInitDialog(); //}}AFX_MSG DECLARE_MESSAGE_MAP() };
//{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_LOGINDLG_H__C757DD49_652B_41A1_84C3_EC0D3C40A07F__INCLUDED_)
---------------------------------------------------------------------------------------------------------------------------------------------------
// LoginDlg.cpp : implementation file //
#include "stdafx.h" #include "userlogin.h" #include "LoginDlg.h" #include "userloginDlg.h"
#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif
/ // CLoginDlg dialog
CLoginDlg::CLoginDlg(CWnd* pParent /*=NULL*/) : CDialog(CLoginDlg::IDD, pParent) { //{{AFX_DATA_INIT(CLoginDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT }
void CLoginDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CLoginDlg) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP }
BEGIN_MESSAGE_MAP(CLoginDlg, CDialog) //{{AFX_MSG_MAP(CLoginDlg) //}}AFX_MSG_MAP END_MESSAGE_MAP()
/ // CLoginDlg message handlers
void CLoginDlg::OnOK() { // TODO: Add extra validation here /* char *szBuf = new char[128]; GetDlgItemText(IDC_EDIT1, szBuf, 128); MessageBox(szBuf);*/ if (! UserValid()) return;
CDialog::OnOK(); }
void CLoginDlg::OnCancel() { // TODO: Add extra cleanup here
CDialog::OnCancel(); }
BOOL CLoginDlg::UserValid() { _ConnectionPtr &cPtr = ((CUserloginDlg*)GetParent())->m_pConn; char* szUserName = (char*)((CUserloginDlg*)GetParent())->m_szUserName;
_RecordsetPtr pRs; pRs.CreateInstance(__uuidof(Recordset));
// 确保用户名输入不为空 char szName[128]; GetDlgItemText(IDC_EDIT1, szName, 128); if (NULL == szName[0]) { AfxMessageBox("用户名不能为空!"); return FALSE; } char szpw[128]; GetDlgItemText(IDC_EDIT2, szpw, 128); if (NULL == szpw[0]) { AfxMessageBox("密码不能为空!"); return FALSE; }
// 从 account 表里读出用户信息 char szSQL[256]; sprintf(szSQL, "%s%s", "SELECT * FROM account where username='", szName); strcat(szSQL, "'");
try { HRESULT hr = pRs->Open(szSQL, cPtr.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
// 确保用户存在 if (pRs->adoEOF) { AfxMessageBox("用户名无效,请重新输入!"); pRs->Close(); pRs.Release(); return FALSE; } }
catch (_com_error e) { AfxMessageBox(e.ErrorMessage()); }
CString l_str; variant_t var;
try { var = pRs->GetCollect(_variant_t("password")); if (var.vt != VT_NULL) { l_str = (LPCTSTR)_bstr_t(var); if (l_str == szpw) { // AfxMessageBox("密码正确"); strcpy(szUserName, szName); } else { AfxMessageBox("密码错误,请重新输入!"); return FALSE; } } else { l_str = _T("none"); AfxMessageBox(l_str); return FALSE; } } catch (_com_error e) { AfxMessageBox(e.Description()); } pRs->Close(); pRs.Release(); }
BOOL CLoginDlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
--------------------------------------------------------------------------------------------------------------------------------------------------
// userlogin.h : main header file for the USERLOGIN application //
#if !defined(AFX_USERLOGIN_H__433A5C98_5C19_49A2_8ACA_5AD5FF116D77__INCLUDED_) #define AFX_USERLOGIN_H__433A5C98_5C19_49A2_8ACA_5AD5FF116D77__INCLUDED_
#if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000
#ifndef __AFXWIN_H__ #error include 'stdafx.h' before including this file for PCH #endif
#include "resource.h" // main symbols
/ // CUserloginApp: // See userlogin.cpp for the implementation of this class //
class CUserloginApp : public CWinApp { public: CUserloginApp();
// Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CUserloginApp) public: virtual BOOL InitInstance(); //}}AFX_VIRTUAL
// Implementation
//{{AFX_MSG(CUserloginApp) // NOTE - the ClassWizard will add and remove member functions here. // DO NOT EDIT what you see in these blocks of generated code ! //}}AFX_MSG DECLARE_MESSAGE_MAP() };
/
//{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_USERLOGIN_H__433A5C98_5C19_49A2_8ACA_5AD5FF116D77__INCLUDED_) ----------------------------------------------------------------------------------------------------------------------------------------------
// userlogin.cpp : Defines the class behaviors for the application. //
#include "stdafx.h" #include "userlogin.h" #include "userloginDlg.h"
#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif
/ // CUserloginApp
BEGIN_MESSAGE_MAP(CUserloginApp, CWinApp) //{{AFX_MSG_MAP(CUserloginApp) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG ON_COMMAND(ID_HELP, CWinApp::OnHelp) END_MESSAGE_MAP()
/ // CUserloginApp construction
CUserloginApp::CUserloginApp() { // TODO: add construction code here, // Place all significant initialization in InitInstance }
/ // The one and only CUserloginApp object
CUserloginApp theApp;
/ // CUserloginApp initialization
BOOL CUserloginApp::InitInstance() { OleInitialize(NULL); AfxEnableControlContainer();
// Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need.
#ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif
CUserloginDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: Place code here to handle when the dialog is // dismissed with OK } else if (nResponse == IDCANCEL) { // TODO: Place code here to handle when the dialog is // dismissed with Cancel }
// Since the dialog has been closed, return FALSE so that we exit the // application, rather than start the application's message pump. return FALSE; }