mfc利用SQL、DAO调用access数据库

程序效果图:如图1、图2


图1


图2

1、首先应包含dao的头文件

#include "afxdao.h"

2、声明数据库及数据记录集

CDaoDatabase db;                                       //数据库

CDaoRecordset RecSet(&db);                   //记录集

这两条语句是在.cpp文件中写的,没有在.h文件中的加入变量的原因是,需要初始化RecSet。

3、获取函数所在文件夹的路径,来存放数据表:

CString sPath;

         GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);

         sPath.ReleaseBuffer();

         intnPos;

         nPos=sPath.ReverseFind('\\');//返回此CString对象中与要求的字符匹配的最后一个字符的索引

         sPath=sPath.Left(nPos);

         CStringlpszFile = sPath + "\\TestDb.mdb";

这使得TestDb.mdb与debug中的.exe程序存放在一个文件夹

4、创建数据库,并建立一张表

db.Create(lpszFile);

         CStringSqlCmd = "CREATE TABLE Login(Account VARCHAR(10),PasswordVARCHAR(10));";

         db.Execute(SqlCmd);//创建第一张表

其中表名为Login

5、为表加入属性

RecSet.Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT* FROM Login", 0);

         //加入第一个记录,用SQL语句

         db.Execute("insertinto Login (Account,Password) values ('fuyanzhi','yulin')");

用到了DAO语句来打开数据表;

用到了insert into (Field1,..) values(‘’)来插入属性。

6、关闭数据库

         db.Close();

         RecSet.Close();

在打开数据库后,进行操作后,要记得关闭数据库,否则会出现错误。

7、通用控件contrl list

CFont  m_ListFont;

         m_ListFont.CreatePointFont(120,"宋体");

         DWORDdwExStyle = m_AccessList1.GetExStyle();

         dwExStyle&=~LVS_EX_CHECKBOXES;              

         m_AccessList1.SetFont(&m_ListFont);

         m_AccessList1.SetExtendedStyle(dwExStyle|LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_ONECLICKACTIVATE);

         TEXTMETRICtm;

         CDC*pDC=GetDC();

         pDC->GetTextMetrics(&tm);

         m_AccessList1.InsertColumn(0,"姓名",LVCFMT_CENTER,60,0);

         m_AccessList1.InsertColumn(1,"性别",LVCFMT_CENTER,60,0);

         m_AccessList1.InsertColumn(2,"年龄",LVCFMT_CENTER,60,0);

效果如下图所示:


8、导入数据库到上图界面中

         COleVariantvar;                // 字段类型

         var.ChangeType(VT_BSTR,NULL);

RecSet.Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT* FROM TestDb order by Name ASC",NULL);

         m_AccessList1.DeleteAllItems();//清空表

         CStringstr[3];

         CStringstr1;

         inti=0;

         while(!RecSet.IsEOF())

         {

                   RecSet.GetFieldValue("Name",var);

                   str[0]= (LPCSTR)var.pbstrVal;

                   RecSet.GetFieldValue("Sex",var);

                   str[1]=(LPCSTR)var.pbstrVal;

                   RecSet.GetFieldValue("Age",var);

                   str[2].Format("%d",(LPCSTR)var.pbstrVal);

                   str1.Format("%d",i);

                   m_AccessList1.InsertItem(i,str1,-1);//这条很重要,是创见了一个新的行

                   for(intj=0;j<=2;j++)

                   m_AccessList1.SetItemText(i,j,str[j]);

                   i++;

                   RecSet.MoveNext();

         }

9、删除记录

Void delete()

{

CString sPath;

         GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);

         sPath.ReleaseBuffer();

   int nPos;

         nPos=sPath.ReverseFind('\\');

         sPath=sPath.Left(nPos);

         CStringstrFile = sPath + "\\TestDb.mdb";

         db.Open(strFile);               // 打开已创建的demo数据库及DemoTable表

         RecSet.Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT* FROM TestDb",NULL);

         CStringstr1,strname,msg;

         inti;

         i=m_AccessList1.GetSelectionMark();

         if(i==-1)

         {

                   MessageBox("pleasechoose!");

                   db.Close();

                   RecSet.Close();

                   return;

         }

         strname=m_AccessList1.GetItemText(i,0);   

         SetDlgItemText(IDC_EDIT2,strname);

         UpdateData(FALSE);

         msg.Format("第 %d 项,姓名为“%s”的记录将被删除!是否继续?",i+1,strname);

         if(MessageBox(msg,"提示",MB_YESNO|MB_ICONINFORMATION)==IDYES)

         {

                   str1.Format("deletefrom TestDb where NAME='%s'",strname);

                   db.Execute(str1);

                   m_AccessList1.DeleteItem(i);

         }

         db.Close();

         RecSet.Close();

}

其中,m_AccessList1.GetSelectionMark()为获得当前选中的记录

10、增加记录

void Addnew ()

{

         CDaoDatabasedb;                                       //数据库

         CDaoRecordsetRecSet(&db);                   //记录集

         UpdateData(TRUE);

         CStringsPath;

         GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);

         sPath.ReleaseBuffer();

   int nPos;

         nPos=sPath.ReverseFind('\\');

         sPath=sPath.Left(nPos);

         CStringstrFile = sPath + "\\TestDb.mdb";

         db.Open(strFile);               // 打开已创建的demo数据库及DemoTable表

         RecSet.Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT* FROM TestDb",NULL);

         CStringstrSQL;

         if(!m_name.IsEmpty())//如果姓名填写了

         {

                   strSQL.Format("insertinto TestDb values('%s','%s','%s')",m_name,m_sex,m_age);

                   db.Execute(strSQL);

                   CDialog::OnOK();                                

         }

         else//如果姓名没填写

         {

                   MessageBox("“姓名”一定要填写!","提示",MB_OK|MB_ICONINFORMATION);

                   m_ctrlname.SetFocus();

         }

         db.Close();

         RecSet.Close();

}

11、修改记录

void CModify ()

{

         CDaoDatabasedb;                                       //数据库

         CDaoRecordsetRecSet(&db);                   //记录集

         UpdateData(TRUE);

         CStringsPath;

         GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);

         sPath.ReleaseBuffer();

   int nPos;

         nPos=sPath.ReverseFind('\\');

         sPath=sPath.Left(nPos);

         CStringstrFile = sPath + "\\TestDb.mdb";

         CStringstrSQL,strname;

         db.Open(strFile);               // 打开已创建的demo数据库及DemoTable表

         RecSet.Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT* FROM TestDb",NULL);

         CTestdbDlg*pFrm = (CTestdbDlg *)AfxGetMainWnd();

         CStringstr3;

         inti=pFrm->m_AccessList1.GetSelectionMark();

         str3.Format("%d",i);

         UpdateData(FALSE);

         strname=pFrm->m_AccessList1.GetItemText(i,0);        

         pFrm->SetDlgItemText(IDC_EDIT2,strname);

         if(!m_name.IsEmpty())//如果姓名填写了

         {

                   strSQL.Format("updateTestDb set Name='%s',Sex='%s',Age='%s' where Name='%s'",m_name,m_sex,m_age,strname);

                   db.Execute(strSQL);

                   db.Close();

                   RecSet.Close();

                   CDialog::OnOK();                                

         }

         else//如果姓名没填写

         {

                   MessageBox("“姓名”一定要填写!","提示",MB_OK|MB_ICONINFORMATION);

                   m_ctrlname.SetFocus();

         }

         db.Close();

         RecSet.Close();

}

12、查询记录

void CTestdbDlg::OnButton6()

{

         //TODO: Add your control notification handler code here

         CStringsPath;

         GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);

         sPath.ReleaseBuffer();

   int nPos;

         nPos=sPath.ReverseFind('\\');

         sPath=sPath.Left(nPos);

         CStringstrFile = sPath + "\\TestDb.mdb";      

         db.Open(strFile);               // 打开已创建的demo数据库及DemoTable表

         RecSet.Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT* FROM TestDb",NULL);

 

         UpdateData(TRUE);

         CStringm_tablefield,m_searchSQL;

         if(m_sfield.Compare("姓名")==0)

         {

                   m_tablefield.Format("Name");

         }

         if(m_sfield.Compare("性别")==0)

         {

                   m_tablefield.Format("Sex");

         }

         if(m_sfield.Compare("年龄")==0)

         {

                   m_tablefield.Format("Age");

         }

         if(!m_keyword.IsEmpty())

         {

                   m_searchSQL.Format("select* from TestDb where %s='%s'",m_tablefield,m_keyword);

         }

         else

         {

                   db.Close();

                   RecSet.Close();

                   MessageBox("请输入要查询的关键字");

                   GetDlgItem(IDC_EDIT1)->SetFocus();

                   return;

         }

         RecSet.Close();

         RecSet.Open(AFX_DAO_USE_DEFAULT_TYPE,m_searchSQL);

         if(RecSet.GetRecordCount()!=0)

         {

                   RecSet.MoveFirst();        

         }

         else

         {

                   db.Close();

                   RecSet.Close();

                   MessageBox("none");

                   return;

         }

         m_AccessList1.DeleteAllItems();

         CStringstr[3],str1;

         COleVariantvar;

         inti=0;

         while(!RecSet.IsEOF())

         {

                   RecSet.GetFieldValue("Name",var);

                   str[0]= (LPCSTR)var.pbstrVal;

                   RecSet.GetFieldValue("Sex",var);

                   str[1]=(LPCSTR)var.pbstrVal;

                   RecSet.GetFieldValue("Age",var);

                   str[2]= (LPCSTR)var.pbstrVal;

                   str1.Format("%d",i);

                   m_AccessList1.InsertItem(i,str1,-1);//这条很重要,是创见了一个新的行

                   for(intj=0;j<=2;j++)

                            m_AccessList1.SetItemText(i,j,str[j]);

                   i++;

                   RecSet.MoveNext();

         }

         db.Close();

         RecSet.Close();

}

其中m_sfield.Compare为combo box控件的函数

还有一点很重要,当表里存放的数据为int型时,比如Age为int型数据,

(“select * from TestDb where Age=%s",m_age)中,%s是不加’’的,切记。

13、最后说一下登陆界面

如果想在主界面出来之前加入一个登陆界面,只需在CTestdbApp::InitInstance()中,将主界面的类名改为登陆界面的类名。

CLogin login;

//SetDialogBkColor(RGB(150,180,250),RGB(0,0,255));//可以设置背景颜色

int nResponse1=login.DoModal();

m_pMainWnd = &login;

但是这里存在一上问题,m_pMainWnd = &login;当最开始的界面变成登陆界面了后,m_pMainWnd的句柄就指向了LOGIN界面,所以利用AfxGetMainWnd()获得的句柄就是指向了LOGIN界面。

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值