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

mfc利用SQL、DAO调用access数据库相关推荐

  1. MFC 使用 ADO技术连接Access数据库

    学了很久的MFC,于是想着使用MFC的ADO技术连接Access数据库. 记录一下,以备后面复习. 1.首先需要了解MDB数据库文件,本次示例代码连接的是MDB数据库文件.*.MDB文件是(Micro ...

  2. SQL SERVER访问Access数据库,出现错误:无法初始化链接服务器 (null) 的 OLE DB 访问接口 Microsoft.Jet.OLEDB.4.0 的数据源对象

    SQL SERVER访问Access数据库,出现错误: 无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.Jet.OLEDB.4. ...

  3. SQL SERVER访问Access数据库,出现错误:无法初始化链接服务器 (null) 的 OLE DB 访问接口 Microsoft.Jet.OLEDB.4.0 的数据源对象...

    SQL SERVER访问Access数据库,出现错误: 无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.Jet.OLEDB.4. ...

  4. VS2019程序打包(带sql sever转access数据库)

    因为自己在打包的时候根据网上的操作却并没有实现带数据库的操作,偶然看到有人说用accesss属于小型数据库系统,更容易打包,经过尝试之后确实也成功了,今天便将自己的打包过程分享给大家. 因为自己刚开始 ...

  5. 利用SQL语句在SQLite数据库中实现命令执行

    SQLite是世界上使用最多的数据库之一.然而,关于其安全方面的研究,都只涉及WebSQL和浏览器开发方面.我们相信这只是SQLite安全的冰山一角. 在对SQLite安全性的长期研究中,我们尝试在任 ...

  6. python调用access数据库_Python3.7 pyodbc完美配置访问access数据库

    环境 win2008 r2 64为系统 python3.7.pyodbc 安装好python3.7以后,那么就需要安装pyodbc了. 数据库连接 数据库连接网上大致有两种方法,一种是使用pyodbc ...

  7. Sql Server导入Access数据库报不可识别的数据库格式 Microsoft JET Database Engine

    解决办法: 1.mdb 数据库转成  sql脚本 放在 sqlserver  运行一次就好了 2.在Access的Sql Server[升迁向导]中升迁为Sql Server然后导入

  8. 利用SQL语句查找某数据库中所有存储过程包含的内容

    查找存储过程包含内容 Use 数据库 DECLARE @ProcName varchar(50) Create Table #tmpName(Content  varchar(2000)) Creat ...

  9. access update语句执行_SQL Server与Access数据库sql语法十大差异

    本文总结了SQL Server与Access数据库sql语法的十大差异. ACCESS结构简单容易处理,而且也能满足多数的应用程序要求,也是初学者的试牛刀. 随着时间的推移,大多数数据库应用程序都会发 ...

最新文章

  1. python能做什么项目好-python能做什么项目
  2. 三元运算 三个数取最大的
  3. 一个flash网页图片播放器
  4. C++ 易混淆的概念-sizeof和strlen、char* 和char[]、*p++和(*p)++
  5. parceljs 中文文档24小时诞生记
  6. 在开源UOJ的导航栏中添加新页面链接
  7. Java网络编程之IP地址
  8. 关于文件、文件夹加密隐藏原理的一点想法
  9. mysql先进后出_栈、队列中“先进先出”,“后进先出”的含义
  10. git启动linux系统,gitlab 开机自动启动配置
  11. 2021年中国宽带接入情况、用户规模及使用情况分析[图]
  12. 用Excel进行频域分析
  13. C++11时代的标准库快餐教程(4) - 排序算法的应用
  14. Synchronized 用法总结
  15. eos节点服务器_EOS柚子生态投票的骗局,你以为自己在区块恋革命,其实是在参与CX罢了...
  16. CCF之小明上学——2018.12 第一题 (java满分代码)
  17. Python3 面向对象基础1
  18. 逆向中常见寄存器及常用汇编指令
  19. python单一数字取对数与数列取对数
  20. 深入理解Golang之Map

热门文章

  1. 技术分享:印制插头侧面包镍金加工工艺研究
  2. Altium Designer Summer 09快捷键
  3. Android Studio校园二手交易市场app
  4. CrawlSpider实现微信小程序社区爬虫
  5. vite+ts+vue3 知识点(定义全局函数和变量)
  6. 中国科学院大学重庆学院继续教育学院学前教育专业
  7. 一种Android应用耗电定位方案
  8. 小程序学习历程(二):注册小程序测试号
  9. nodejs addon
  10. 在校大学生/老师如何申请注册一家公司