程序效果图:如图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界面。