Access 与C++编程

来源:互联网 发布:慈溪楼市每日成交数据 编辑:程序博客网 时间:2024/06/06 20:50

本项目用C++做一个与Access数据库操作的项目。

一个登陆,一个增删改查。

主界面设计如下:


控件关联变量如下:



登录设计界面如下:(添加类CLoginDialog)


控件关联变量如下:



打开Microsoft Office->Access->建数据库Employee.accdb

建两张表:

t_worker存放员工信息


t_user存放登录用户信息


两张表插入一些数据,保存后,将Employee.accdb放在项目源文件同一目录下。


准备工作:引入吕鑫老师封装好的操作数据库的类CAdoLx,功能强大,使用简单。在“鑫路历程”官网可下载源代码。

若因为Access版本的原因连接不上数据库,下载AccessDatabaseEngine.exe,安装就可以了。

我使用的是Microsoft Office2007


启动项目时,登录对话框先弹出来:在App类的InitInstance()中实现

BOOL CWorkerApp::InitInstance(){CLoginDialog logDlg;logDlg.DoModal();CWorkerDlg dlg;m_pMainWnd = &dlg;INT_PTR nResponse = dlg.DoModal();return FALSE;}

登录验证:

添加数据库操作的类对象:CAdoLx m_ado1;

void CLoginDialog::OnBnClickedBtnLogin(){//连接数据库if(!m_ado1.Connect(CAdoLx::DBT_ACCESS,_T("./Employee.accdb")))MessageBox(m_ado1.GetLastError());UpdateData();CString szSql;//根据用户名和密码查询数据szSql.Format(_T("SELECT * FROM t_user WHERE f_name='%s' AND f_pwd='%s'"),m_user,m_pwd);if(!m_ado1.Select(szSql))  //执行查询AfxMessageBox(m_ado1.GetLastError());if(m_ado1.IsEOF())  //如果查询记录为空,则失败MessageBox(_T("用户名或密码错误!"));elseCDialog::OnOK();}

在主对话框的OnInitDialog()中初始化控件及连接数据库

添加数据库操作的类对象:CAdoLx m_ado;

//列表框插入列m_list.InsertColumn(0,_T("工号"),0,120);m_list.InsertColumn(1,_T("姓名"),0,120);m_list.InsertColumn(2,_T("薪水"),0,120);m_list.InsertColumn(3,_T("入职日期"),0,120);//设置扩展风格m_list.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);//连接Access数据库中的Employee.accdb,该文件在源文件同目录下if(!m_ado.Connect(CAdoLx::DBT_ACCESS,_T("./Employee.accdb")))MessageBox(m_ado.GetLastError());Refresh();//刷新列表框,查询到的数据显示在列表框中

其中Refresh()的代码如下:(查询功能)

void CWorkerDlg::Refresh(void)   //将表内数据显示到列表框{m_list.DeleteAllItems();   //先清空列表框CString szSql=_T("SELECT * FROM t_worker");  //查询语句//szSql=_T("SELECT * FROM t_worker WHERE f_id<100");  //条件查询if(!m_ado.Select(szSql))   //执行查询MessageBox(m_ado.GetLastError());int nID,i=0;double dSal;COleDateTime dt;CString str;while(!m_ado.IsEOF())   //遍历表中数据,添加到列表框中{//获取ID//**********注意:GetFieldByIndex()第一个参数为返回的记录数据的字段索引,而非表中字段的索引**********m_ado.GetFieldByIndex(0,nID);str.Format(_T("%d"),nID);m_list.InsertItem(i,str);//获取姓名m_ado.GetFieldByIndex(1,str);m_list.SetItemText(i,1,str);//获取薪水m_ado.GetFieldByIndex(2,dSal);str.Format(_T("%0.2lf"),dSal);m_list.SetItemText(i,2,str);//获取入职日期m_ado.GetFieldByIndex(3,dt);//str.Format(_T("%d"),nID);m_list.SetItemText(i,3,dt.Format(_T("%Y年%m月%d日")));m_ado.MoveNext();   //下一条记录i++;}}

增:

void CWorkerDlg::OnBnClickedBtnAdd(){UpdateData();CString szSql;//全字段插入数据//szSql.Format(_T("INSERT INTO t_worker VALUES(%d,'%s',%0.2lf,'%s')"),m_nID,m_name,m_sala,m_date.Format(_T("%Y-%m-%d")));//部分字段插入数据szSql.Format(_T("INSERT INTO t_worker (f_name,f_salary,f_date) VALUES('%s',%0.2lf,'%s')"),m_name,m_sala,m_date.Format(_T("%Y-%m-%d")));if(m_ado.ExecSQL(szSql)<0)  //执行失败,返回负数MessageBox(szSql);Refresh(); //将表内数据显示到列表框}


删:

void CWorkerDlg::OnBnClickedBtnDel(){int nSel=m_list.GetSelectionMark();if(nSel<0){MessageBox(_T("请选择一条数据删除!"));return;}CString szID=m_list.GetItemText(nSel,0);if(AfxMessageBox(_T("确定要删除工号为")+szID+_T("的这条记录吗?"),MB_YESNO)==IDNO)return;CString szSql;szSql.Format(_T("DELETE FROM t_worker WHERE f_ID=%s"),szID);if(m_ado.ExecSQL(szSql)<0)MessageBox(szSql);elseRefresh();}

改:

void CWorkerDlg::OnBnClickedBtnModify(){int nSel=m_list.GetSelectionMark();if(nSel<0){MessageBox(_T("请选择一条数据进行修改!"));return;}CString szID=m_list.GetItemText(nSel,0);if(AfxMessageBox(_T("确定要修改工号为")+szID+_T("的这条记录吗?"),MB_YESNO)==IDNO)return;UpdateData();CString szSql;szSql.Format(_T("UPDATE t_worker SET f_name='%s',f_salary=%0.2lf,f_date='%s' WHERE f_ID=%s"),m_name,m_sala,m_date.Format(_T("%Y-%m-%d")),szID);if(m_ado.ExecSQL(szSql)<0)MessageBox(szSql);elseRefresh();}

 
原创粉丝点击