⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adodlg.cpp

📁 ADO连接数据库
💻 CPP
字号:
// ADODlg.cpp : 实现文件
//

#include "stdafx.h"
#include "ADO.h"
#include "ADODlg.h"
#include "SpreadSheet.h"
#include ".\adodlg.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// 对话框数据
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CADODlg 对话框



CADODlg::CADODlg(CWnd* pParent /*=NULL*/)
	: CDialog(CADODlg::IDD, pParent)
	, m_Num(0)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CADODlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST, m_List);
}

BEGIN_MESSAGE_MAP(CADODlg, CDialog)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_BN_CLICKED(IDC_ADD, OnBnClickedAdd)
	ON_BN_CLICKED(IDC_MODIFY, OnBnClickedModify)
	ON_BN_CLICKED(IDC_DEL, OnBnClickedDel)
	ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST, OnLvnItemchangedList)
	ON_WM_DESTROY()
	ON_BN_CLICKED(IDC_RUSH, OnBnClickedRush)
	ON_BN_CLICKED(IDC_EXPORT, OnBnClickedExport)
END_MESSAGE_MAP()


// CADODlg 消息处理程序
#define NUM_COLUMNS 3

static _TCHAR *_gszColumnLabel[NUM_COLUMNS] =
{
	_T("名称"), _T("年龄"),_T("性别")
};

static int _gnColumnWidth[NUM_COLUMNS] =
{
	120, 120,120,
};
IMPLEMENT_DYNAMIC(CADODlg, CDialog)

BOOL CADODlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// 将\“关于...\”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	if (!AfxOleInit())
	{
		return false ;
	}
	

	if (!OpenDB())
	{
		return FALSE;
	}

	// TODO: 在此添加额外的初始化代码
	DWORD dwStyle = m_List.GetExtendedStyle();
	dwStyle |= LVS_EX_FULLROWSELECT;
	m_List.SetExtendedStyle(dwStyle);

	// 设置表头
	int			i ;
	LV_COLUMN	lvc ;

	lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM ;
	for(i = 0; i<NUM_COLUMNS; i++)
	{
		lvc.iSubItem = i ;
		lvc.pszText = _gszColumnLabel[i] ;
		lvc.cx = _gnColumnWidth[i] ;
		lvc.fmt = LVCFMT_LEFT ;
		m_List.InsertColumn(i, &lvc);
	}
	
	GetInfo();

	return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE
}

void CADODlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CADODlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作矩形中居中
		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;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CADODlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

void CADODlg::OnBnClickedAdd()
{
	// TODO: 在此添加控件通知处理程序代码
	int i,j;

	CString strName,strAge,strSex;
	((CEdit*)GetDlgItem(IDC_NAME))->GetWindowText(strName);

	if (strcmp(strName,_T("")) == 0)
	{
		AfxMessageBox("姓名不能为空");
		return ;
	}
	((CEdit*)GetDlgItem(IDC_AGE))->GetWindowText(strAge);
	i = atoi(strAge);

	((CEdit*)GetDlgItem(IDC_SEX))->GetWindowText(strSex);

	CString tempeg = "女";
	CString tempex = "男";

	if ((strcmp(strSex,tempex) != 0)&&(strcmp(strSex,tempeg) != 0))
	{
		AfxMessageBox("请输入男或女!");
		return ;
	}

	if (strcmp(strSex ,tempex) == 0)
	{
		j = 0;
	}
	else
	{
		j = 1;
	}

	UpdateData();
	_RecordsetPtr	m_pRecordset;
	m_pRecordset.CreateInstance(__uuidof(Recordset));
	try
	{
		m_pRecordset->Open("SELECT * FROM Stu",                // 查询DemoTable表中所有字段
			m_pConnection.GetInterfacePtr(),	 // 获取库接库的IDispatch指针
			adOpenDynamic,
			adLockOptimistic,
			adCmdText);
	}
	catch(_com_error *e)
	{
		AfxMessageBox(e->ErrorMessage());
	}  
    
	m_pRecordset->AddNew();
	m_pRecordset->PutCollect("Name",_variant_t(strName));
	m_pRecordset->PutCollect("Old",_variant_t(i));
	m_pRecordset->PutCollect("Sex", _variant_t(j));
	m_pRecordset->Update();

	m_pRecordset->Close();
	m_pRecordset = NULL;

	STU_INFO Info;
	strcpy(Info.name,strName);
	Info.old = i ;
	Info.sex = j ;

	ShowInfo(TRUE,m_Num,&Info);
}

void CADODlg::OnBnClickedModify()
{
	// TODO: 在此添加控件通知处理程序代码
	long        nCurSelRow;
	CString     strSql,temp;
	int i,j;

	nCurSelRow = m_List.GetNextItem(-1,LVNI_SELECTED);
	temp = m_List.GetItemText(nCurSelRow,0);

	CString strName,strAge,strSex;
	((CEdit*)GetDlgItem(IDC_NAME))->GetWindowText(strName);
     if (strcmp(temp,strName) != 0)
     {
		 AfxMessageBox("不能修改名字!");
		 return ;
     }

	((CEdit*)GetDlgItem(IDC_AGE))->GetWindowText(strAge);
	i = atoi(strAge);

	((CEdit*)GetDlgItem(IDC_SEX))->GetWindowText(strSex);

	CString tempeg = "女";
	CString tempex = "男";

	if ((strcmp(strSex,tempex) != 0)&&(strcmp(strSex,tempeg) != 0))
	{
		AfxMessageBox("请输入男或女!");
		return ;
	}

    if (strcmp(strSex ,tempex) == 0)
    {
        j = 0;
    }
	else
	{
		j = 1;
	}

	UpdateData();

	try
	{		
		strSql.Format("update Stu set Old=%d,Sex=%d Where Name = '%s'",i,j,temp);
		_variant_t vAffected;
		m_pConnection->Execute(_bstr_t(strSql),&vAffected,adCmdText);

	}
	catch(_com_error *e)
	{
		AfxMessageBox(e->ErrorMessage());
	}  
    
	STU_INFO Info;
	strcpy(Info.name,temp);
	Info.old = i ;
	Info.sex = j ;

	ShowInfo(FALSE,nCurSelRow,&Info);

}

void CADODlg::OnBnClickedDel()
{
	// TODO: 在此添加控件通知处理程序代码
	long        nCurSelRow;
    CString     strSql,temp;
	
	nCurSelRow = m_List.GetNextItem(-1,LVNI_SELECTED);
    temp = m_List.GetItemText(nCurSelRow,0);

	_variant_t var;
	_RecordsetPtr pName;
	pName.CreateInstance(__uuidof(Recordset));

	try
	{		
		strSql.Format("SELECT * FROM Stu Where Name = '%s'",temp);

		pName->Open(_variant_t(strSql),m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
	}
	catch(_com_error *e)
	{
		AfxMessageBox(e->ErrorMessage());
	}  

    pName->Delete(adAffectCurrent);

	m_List.DeleteItem(nCurSelRow) ;

	m_Num--;

}

BOOL CADODlg::GetInfo(void)
{
	_RecordsetPtr	m_pRecordset;
	m_pRecordset.CreateInstance(__uuidof(Recordset));

	_variant_t var;
	STU_INFO Info;
	CString temp;
	int i = 0;
	// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
	// 因为它有时会经常出现一些意想不到的错误。jingzhou xu
	try
	{
		m_pRecordset->Open("SELECT * FROM Stu",m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
	}
	catch(_com_error *e)
	{
		AfxMessageBox(e->ErrorMessage());
		return FALSE;
	}
    
    while (!m_pRecordset->adoEOF)
    {
		var = m_pRecordset->GetCollect("Name");
		if(var.vt != VT_NULL)
			temp = (LPCSTR)_bstr_t(var);
        strcpy(Info.name,temp);

		var = m_pRecordset->GetCollect("Old");
		if(var.vt != VT_NULL)
			temp = (LPCSTR)_bstr_t(var);
        Info.old = atoi(temp.GetBuffer());
		temp.ReleaseBuffer();

		var = m_pRecordset->GetCollect("Sex");
		if(var.vt != VT_NULL)
			temp = (LPCSTR)_bstr_t(var);
		Info.sex = atoi(temp.GetBuffer());
		temp.ReleaseBuffer();
	     
		ShowInfo(TRUE,i,&Info);

		i++;
		m_Num++;

		m_pRecordset->MoveNext();

    }

	m_pRecordset->Close();
	m_pRecordset = NULL ;

	return TRUE;
}

void CADODlg::ShowInfo(bool bNew,int nRow,PSTU_INFO pInfo)
{
	LV_ITEM			lvi;

	CString         str ;

	// 名称
	lvi.mask = LVIF_TEXT ;
	lvi.iItem = nRow;
	lvi.iSubItem = 0;	
	lvi.pszText = pInfo->name ;	
	if ( bNew == TRUE )
		m_List.InsertItem(&lvi);
	else
		m_List.SetItem(&lvi);

	// 封装模式
	lvi.iSubItem = 1 ;
	CString temp;
	temp.Format("%d",pInfo->old);
	lvi.pszText = (LPTSTR)(LPCTSTR)temp ;
	m_List.SetItem(&lvi);

	lvi.iSubItem = 2 ;
	switch(pInfo->sex)
	{
	case 1:
		lvi.pszText = "女";
		break;
	case 0 :
		lvi.pszText = "男";
		break;
	}	
	m_List.SetItem(&lvi);

	m_List.SetItemData(nRow, (DWORD_PTR)pInfo) ;
	m_List.SetFocus() ;
	return ;
}

void CADODlg::OnLvnItemchangedList(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
     CString temp;
     if (pNMLV->uNewState != 0)
     {
        // pInfo = (PSTU_INFO)m_List.GetItemData(pNMLV->iItem) ;

        temp = m_List.GetItemText(pNMLV->iItem,0); 
 		((CEdit*)GetDlgItem(IDC_NAME))->SetWindowText(temp) ;
        
		temp = m_List.GetItemText(pNMLV->iItem,1);
 		((CEdit*)GetDlgItem(IDC_AGE))->SetWindowText(temp) ;
 		
		temp = m_List.GetItemText(pNMLV->iItem,2);
 		((CEdit*)GetDlgItem(IDC_SEX))->SetWindowText(temp) ;
 
     }
	*pResult = 0;
}

BOOL CADODlg::OpenDB(void)
{
	m_pConnection.CreateInstance(__uuidof(Connection));
	try                 
	{	
		// 打开本地Access库Demo.mdb
		m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=student.mdb","","",adModeUnknown);
	}
	catch(_com_error e)
	{
		AfxMessageBox("数据库连接失败,确认数据库student.mdb是否在当前路径下!");
		return FALSE;
	}
	return TRUE;
}

BOOL CADODlg::CloseDB(void)
{
	if(m_pConnection->State)
		m_pConnection->Close();
	m_pConnection= NULL;  

	return TRUE;
}
void CADODlg::OnDestroy()
{
	CDialog::OnDestroy();

	// TODO: 在此处添加消息处理程序代码
	 CloseDB();
}

void CADODlg::OnBnClickedRush()
{
	// TODO: 在此添加控件通知处理程序代码
	m_List.DeleteAllItems();
	GetInfo();
}

void CADODlg::OnBnClickedExport()
{
	// TODO: 在此添加控件通知处理程序代码
	if ( MessageBox("是否要进行学生表导出操作?", "提示", MB_OKCANCEL | MB_ICONWARNING) == IDCANCEL )
		return ;

	CFileDialog			dlg(FALSE, _T("xls"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Excel File(*.xls)|*.xls|", NULL) ;
	CStringArray		Rows ;
	CString				str ;

	if ( dlg.DoModal() == IDCANCEL )
		return ;

	// 如果文件存在,则删除
	DeleteFile(dlg.GetPathName()) ;

	// 将数据写入Excel文件中
	// 不支持备份
	CSpreadSheet    SS(dlg.GetPathName(), "学生表", false) ;

	SS.BeginTransaction();

	// 加入标题
	Rows.RemoveAll();
	Rows.Add("名称");
	Rows.Add("年龄");
	Rows.Add("性别");
	SS.AddHeaders(Rows);

	// 加入数据
	for(int i = 0; i < m_List.GetItemCount(); i++) 
	{
		Rows.RemoveAll();

		Rows.Add(m_List.GetItemText(i, 0));
		Rows.Add(m_List.GetItemText(i, 1));
		Rows.Add(m_List.GetItemText(i, 2));
	
		SS.AddRow(Rows);
	}

	SS.Commit() ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -