失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > mfc利用SQL DAO调用access数据库

mfc利用SQL DAO调用access数据库

时间:2022-12-08 23:01:20

相关推荐

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(pare("姓名")==0)

{

m_tablefield.Format("Name");

}

if(pare("性别")==0)

{

m_tablefield.Format("Sex");

}

if(pare("年龄")==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();

}

其中pare为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界面。

如果觉得《mfc利用SQL DAO调用access数据库》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。