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;
}
发表于 @ 2008年06月12日 08:20:15|评论(loading...)|收藏