www.pudn.com > 14751_AdoRWAccess.rar > AdoRWAccessDlg.cpp


////////////////////////////////////////////////////////////////////////////// 
//类名:CAdoRWAccessDlg 
//功能:直接通过ADO读、写Access文件示例实现 
//作者:徐景周(jingzhou_xu@163.net) 
//组织:未来工作室(Future Studio) 
//日期:2002.12.10 
///////////////////////////////////////////////////////////////////////////// 
#include "stdafx.h" 
#include "AdoRWAccess.h" 
#include "AdoRWAccessDlg.h" 
#include "About.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
extern CAdoRWAccessApp theApp;       // 在此引用应用类中的theApp来获取库连接指针 
///////////////////////////////////////////////////////////////////////////// 
// CAdoRWAccessDlg dialog 
 
CAdoRWAccessDlg::CAdoRWAccessDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CAdoRWAccessDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CAdoRWAccessDlg) 
	m_Name = _T(""); 
	m_Age = _T(""); 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 
 
void CAdoRWAccessDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CAdoRWAccessDlg) 
	DDX_Control(pDX, IDOK, m_OK); 
	DDX_Control(pDX, IDC_WRITEACCESS, m_Write); 
	DDX_Control(pDX, IDC_READACCESS, m_Read); 
	DDX_Control(pDX, IDC_MODIFY, m_Modify); 
	DDX_Control(pDX, IDC_DELETE, m_Delete); 
	DDX_Control(pDX, IDC_ABOUT, m_About); 
	DDX_Control(pDX, IDC_LISTACCESS, m_AccessList); 
	DDX_Text(pDX, IDC_NAME, m_Name); 
	DDV_MaxChars(pDX, m_Name, 10); 
	DDX_Text(pDX, IDC_AGE, m_Age); 
	DDV_MaxChars(pDX, m_Age, 3); 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CAdoRWAccessDlg, CDialog) 
	//{{AFX_MSG_MAP(CAdoRWAccessDlg) 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_BN_CLICKED(IDC_WRITEACCESS, OnWriteAccess) 
	ON_BN_CLICKED(IDC_READACCESS, OnReadAccess) 
	ON_BN_CLICKED(IDC_ABOUT, OnAbout) 
	ON_LBN_SELCHANGE(IDC_LISTACCESS, OnSelchangeListaccess) 
	ON_BN_CLICKED(IDC_DELETE, OnDelete) 
	ON_BN_CLICKED(IDC_MODIFY, OnModify) 
	ON_WM_CTLCOLOR() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CAdoRWAccessDlg message handlers 
////////////////////////////////////////////////////////////////////////////// 
//名称:OnInitDialog 
//功能:初始化对话框 
//作者:徐景周(jingzhou_xu@163.net) 
//组织:未来工作室(Future Studio) 
//日期:2002.12.10 
///////////////////////////////////////////////////////////////////////////// 
BOOL CAdoRWAccessDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
 
	// Set the icon for this dialog.  The framework does this automatically 
	//  when the application's main window is not a dialog 
	SetIcon(m_hIcon, TRUE);			// Set big icon 
	SetIcon(m_hIcon, FALSE);		// Set small icon 
	 
	// 初始化XP风格按钮 
	m_Read.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30); 
	m_Read.SetBkColor(RGB(162,189,252)); 
	m_Read.SetTooltipText(_T("读取全部记录")); 
	m_Read.SetRounded(TRUE); 
	m_Write.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30); 
	m_Write.SetBkColor(RGB(162,189,252)); 
	m_Write.SetTooltipText(_T("插入新记录")); 
	m_Write.SetRounded(TRUE); 
	m_Modify.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30); 
	m_Modify.SetBkColor(RGB(162,189,252)); 
	m_Modify.SetTooltipText(_T("修改当前记录")); 
	m_Modify.SetRounded(TRUE); 
	m_Delete.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30); 
	m_Delete.SetBkColor(RGB(162,189,252)); 
	m_Delete.SetTooltipText(_T("删除当前记录")); 
	m_Delete.SetRounded(TRUE); 
	m_About.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30); 
	m_About.SetBkColor(RGB(162,189,252)); 
	m_About.SetTooltipText(_T("关于")); 
	m_About.SetRounded(TRUE); 
	m_OK.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30); 
	m_OK.SetBkColor(RGB(162,189,252)); 
	m_OK.SetTooltipText(_T("退出")); 
	m_OK.SetRounded(TRUE); 
 
	// 使用ADO创建数据库记录集 
	m_pRecordset.CreateInstance(__uuidof(Recordset)); 
 
	// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息, 
	// 因为它有时会经常出现一些想不到的错误。jingzhou xu 
	try 
	{ 
		m_pRecordset->Open("SELECT * FROM DemoTable",                // 查询DemoTable表中所有字段 
							theApp.m_pConnection.GetInterfacePtr(),	 // 获取库接库的IDispatch指针 
							adOpenDynamic, 
							adLockOptimistic, 
							adCmdText); 
	} 
	catch(_com_error *e) 
	{ 
		AfxMessageBox(e->ErrorMessage()); 
	} 
 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
// If you add a minimize button to your dialog, you will need the code below 
//  to draw the icon.  For MFC applications using the document/view model, 
//  this is automatically done for you by the framework. 
 
void CAdoRWAccessDlg::OnPaint()  
{ 
	if (IsIconic()) 
	{ 
		CPaintDC dc(this); // device context for painting 
 
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 
 
		// Center icon in client rectangle 
		int cxIcon = GetSystemMetrics(SM_CXICON); 
		int cyIcon = GetSystemMetrics(SM_CYICON); 
		CRect rect; 
		GetClientRect(&rect); 
		int x = (rect.Width() - cxIcon + 1) / 2; 
		int y = (rect.Height() - cyIcon + 1) / 2; 
 
		// Draw the icon 
		dc.DrawIcon(x, y, m_hIcon); 
	} 
	else 
	{ 
		CDialog::OnPaint(); 
	} 
} 
 
// The system calls this to obtain the cursor to display while the user drags 
//  the minimized window. 
HCURSOR CAdoRWAccessDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
////////////////////////////////////////////////////////////////////////////// 
//名称:OnWriteAccess 
//功能:用ADO来写入插入的字段值 
//作者:徐景周(jingzhou_xu@163.net) 
//组织:未来工作室(Future Studio) 
//日期:2002.12.10 
///////////////////////////////////////////////////////////////////////////// 
void CAdoRWAccessDlg::OnWriteAccess()  
{ 
	UpdateData(); 
	if(m_Name == "" || m_Age == "") 
	{ 
		AfxMessageBox("姓名和年龄信息不能为空!"); 
		return; 
	} 
 
	// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息, 
	// 因为它有时会经常出现一些想不到的错误。jingzhou xu 
	try 
	{ 
		// 写入各字段值 
		m_pRecordset->AddNew(); 
		m_pRecordset->PutCollect("Name", _variant_t(m_Name)); 
		m_pRecordset->PutCollect("Age", atol(m_Age)); 
		m_pRecordset->Update(); 
 
		AfxMessageBox("插入成功!"); 
 
		// 更新显示其库内容 
		int nCurSel = m_AccessList.GetCurSel(); 
		OnReadAccess(); 
		m_AccessList.SetCurSel(nCurSel); 
		// 移动记录指针到新的位置 
		OnSelchangeListaccess(); 
	} 
	catch(_com_error *e) 
	{ 
		AfxMessageBox(e->ErrorMessage()); 
	} 
 
} 
 
////////////////////////////////////////////////////////////////////////////// 
//名称:OnReadAccess 
//功能:用ADO从Access文件中读取相应数据并显示出来 
//作者:徐景周(jingzhou_xu@163.net) 
//组织:未来工作室(Future Studio) 
//日期:2002.12.10 
///////////////////////////////////////////////////////////////////////////// 
void CAdoRWAccessDlg::OnReadAccess()  
{ 
	_variant_t var; 
	CString strName,strAge; 
 
	// 清空列表框 
	m_AccessList.ResetContent(); 
	strName=strAge=""; 
 
	// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息, 
	// 因为它有时会经常出现一些想不到的错误。jingzhou xu 
	try 
	{ 
		if(!m_pRecordset->BOF) 
			m_pRecordset->MoveFirst(); 
		else 
		{ 
			AfxMessageBox("表内数据为空"); 
			return; 
		} 
 
		// 读入库中各字段并加入列表框中 
		while(!m_pRecordset->adoEOF) 
		{ 
			var = m_pRecordset->GetCollect("Name"); 
			if(var.vt != VT_NULL) 
				strName = (LPCSTR)_bstr_t(var); 
			var = m_pRecordset->GetCollect("Age"); 
			if(var.vt != VT_NULL) 
				strAge = (LPCSTR)_bstr_t(var); 
 
			m_AccessList.AddString( strName + " --> "+strAge ); 
 
			m_pRecordset->MoveNext(); 
		} 
 
		// 默认列表指向第一项,同时移动记录指针并显示 
		m_AccessList.SetCurSel(0); 
		OnSelchangeListaccess(); 
	} 
	catch(_com_error *e) 
	{ 
		AfxMessageBox(e->ErrorMessage()); 
	} 
 
} 
 
//////////////////////////////////////////////////////////////////////////// 
//名称:OnAbout 
//功能:弹出"关于"对话框 
//作者:徐景周(jingzhou_xu@163.net) 
//组织:未来工作室(Future Studio) 
//日期:2002.12.10 
///////////////////////////////////////////////////////////////////////////// 
void CAdoRWAccessDlg::OnAbout()  
{ 
	About dlgAbout; 
	 
	dlgAbout.DoModal(); 
} 
 
////////////////////////////////////////////////////////////////////////////// 
//名称:DestroyWindow 
//功能:关闭对话框时清除工作 
//作者:徐景周(jingzhou_xu@163.net) 
//组织:未来工作室(Future Studio) 
//日期:2002.12.10 
///////////////////////////////////////////////////////////////////////////// 
BOOL CAdoRWAccessDlg::DestroyWindow()  
{ 
	// 关闭记录集 
	m_pRecordset->Close(); 
	m_pRecordset = NULL; 
	 
	return CDialog::DestroyWindow(); 
} 
 
////////////////////////////////////////////////////////////////////////////// 
//名称:OnSelchangeListaccess 
//功能:当每次选择新的记录时,都会移动指针到新的记录位置并将值显示出来 
//作者:徐景周(jingzhou_xu@163.net) 
//组织:未来工作室(Future Studio) 
//日期:2002.12.10 
///////////////////////////////////////////////////////////////////////////// 
void CAdoRWAccessDlg::OnSelchangeListaccess()  
{ 
	int curSel = m_AccessList.GetCurSel();		 
	_variant_t var,varIndex; 
 
	if(curSel < 0) 
		return; 
 
	try 
	{ 
		// 先将指针移向第一条记录,然后就可以相对第一条记录来随意移动记录指针 
		m_pRecordset->MoveFirst(); 
		m_pRecordset->Move(long(curSel)); 
		 
		var = m_pRecordset->GetCollect("Name"); 
		if(var.vt != VT_NULL) 
			m_Name = (LPCSTR)_bstr_t(var); 
		var = m_pRecordset->GetCollect("Age"); 
		if(var.vt != VT_NULL) 
			m_Age = (LPCSTR)_bstr_t(var); 
		 
		UpdateData(false); 
	} 
	catch(_com_error *e) 
	{ 
		AfxMessageBox(e->ErrorMessage()); 
	} 
 
} 
 
////////////////////////////////////////////////////////////////////////////// 
//名称:OnDelete 
//功能:删除并更新当前记录 
//作者:徐景周(jingzhou_xu@163.net) 
//组织:未来工作室(Future Studio) 
//日期:2002.12.10 
///////////////////////////////////////////////////////////////////////////// 
void CAdoRWAccessDlg::OnDelete()  
{ 
	if(m_AccessList.GetCount() == 0) 
		return; 
	else if(m_AccessList.GetCurSel() < 0 || m_AccessList.GetCurSel() > m_AccessList.GetCount()) 
		m_AccessList.SetCurSel(0); 
 
	try 
	{ 
		// 删除当前行记录 
		m_pRecordset->Delete(adAffectCurrent); 
		m_pRecordset->Update(); 
 
		// 删除列表中当前值 
		int nCurSel = m_AccessList.GetCurSel(); 
		m_AccessList.DeleteString(nCurSel); 
		if(nCurSel == 0 && (m_AccessList.GetCount() != 0)) 
			m_AccessList.SetCurSel(nCurSel); 
		else if(m_AccessList.GetCount() != 0) 
			m_AccessList.SetCurSel(nCurSel-1); 
		 
		// 移动记录指针到新的位置 
		OnSelchangeListaccess(); 
	} 
	catch(_com_error *e) 
	{ 
		AfxMessageBox(e->ErrorMessage()); 
	} 
 
} 
 
////////////////////////////////////////////////////////////////////////////// 
//名称:OnModify 
//功能:修改并更新当前记录值 
//作者:徐景周(jingzhou_xu@163.net) 
//组织:未来工作室(Future Studio) 
//日期:2002.12.10 
///////////////////////////////////////////////////////////////////////////// 
void CAdoRWAccessDlg::OnModify()  
{ 
	UpdateData();        // 更新对话框数据 
	if(m_AccessList.GetCount() == 0 || m_Name == "" || m_Age == "") 
	{ 
		AfxMessageBox("表中记录数为空或姓名和年龄信息没有设置!"); 
		return; 
	} 
	else if(m_AccessList.GetCurSel() < 0 || m_AccessList.GetCurSel() > m_AccessList.GetCount()) 
		m_AccessList.SetCurSel(0); 
 
	// 修改当前记录的字段值 
	try 
	{ 
		m_pRecordset->PutCollect("Name", _variant_t(m_Name)); 
		m_pRecordset->PutCollect("Age", atol(m_Age)); 
		m_pRecordset->Update(); 
 
		// 重新读入库记录更新显示 
		int nCurSel = m_AccessList.GetCurSel(); 
		OnReadAccess(); 
		m_AccessList.SetCurSel(nCurSel); 
		// 移动记录指针到新的位置 
		OnSelchangeListaccess(); 
	} 
	catch(_com_error *e) 
	{ 
		AfxMessageBox(e->ErrorMessage()); 
	} 
 
} 
 
////////////////////////////////////////////////////////////////////////////// 
//名称:OnCtlColor 
//功能:设置各控件前景、背景色 
//作者:徐景周(jingzhou_xu@163.net) 
//组织:未来工作室(Future Studio) 
//日期:2002.12.10 
///////////////////////////////////////////////////////////////////////////// 
HBRUSH CAdoRWAccessDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)  
{ 
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); 
	 
	if(nCtlColor==CTLCOLOR_LISTBOX) 
	{ 
		//pDC->SetBkMode(TRANSPARENT); 
		pDC->SetTextColor(RGB(0,0,0)); 
		pDC->SetBkColor(RGB(233,233,220)); 
		HBRUSH b=CreateSolidBrush(RGB(233,233,220)); 
		return b; 
	} 
	else if(nCtlColor==CTLCOLOR_SCROLLBAR) 
	{ 
		//pDC->SetBkMode(TRANSPARENT); 
		pDC->SetTextColor(RGB(0,0,0)); 
		pDC->SetBkColor(RGB(233,233,220)); 
		HBRUSH b=CreateSolidBrush(RGB(233,233,220)); 
		return b; 
	} 
	else if(nCtlColor==CTLCOLOR_EDIT) 
	{ 
		//pDC->SetBkMode(TRANSPARENT); 
		pDC->SetTextColor(RGB(0,0,0)); 
		pDC->SetBkColor(RGB(233,233,220)); 
		HBRUSH b=CreateSolidBrush(RGB(233,233,220)); 
		return b; 
	} 
	else if(nCtlColor==CTLCOLOR_STATIC) 
	{ 
		pDC->SetTextColor(RGB(0,0,0)); 
		pDC->SetBkColor(RGB(160,180,220)); 
		HBRUSH b=CreateSolidBrush(RGB(160,180,220)); 
		return b; 
	} 
	else if(nCtlColor==CTLCOLOR_DLG) 
	{ 
		pDC->SetTextColor(RGB(0,0,0)); 
		pDC->SetBkColor(RGB(160,180,220)); 
		HBRUSH b=CreateSolidBrush(RGB(160,180,220)); 
		return b; 
	} 
	 
	return hbr; 
}