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界面。
mfc利用SQL、DAO调用access数据库相关推荐
- MFC 使用 ADO技术连接Access数据库
学了很久的MFC,于是想着使用MFC的ADO技术连接Access数据库. 记录一下,以备后面复习. 1.首先需要了解MDB数据库文件,本次示例代码连接的是MDB数据库文件.*.MDB文件是(Micro ...
- SQL SERVER访问Access数据库,出现错误:无法初始化链接服务器 (null) 的 OLE DB 访问接口 Microsoft.Jet.OLEDB.4.0 的数据源对象
SQL SERVER访问Access数据库,出现错误: 无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.Jet.OLEDB.4. ...
- SQL SERVER访问Access数据库,出现错误:无法初始化链接服务器 (null) 的 OLE DB 访问接口 Microsoft.Jet.OLEDB.4.0 的数据源对象...
SQL SERVER访问Access数据库,出现错误: 无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.Jet.OLEDB.4. ...
- VS2019程序打包(带sql sever转access数据库)
因为自己在打包的时候根据网上的操作却并没有实现带数据库的操作,偶然看到有人说用accesss属于小型数据库系统,更容易打包,经过尝试之后确实也成功了,今天便将自己的打包过程分享给大家. 因为自己刚开始 ...
- 利用SQL语句在SQLite数据库中实现命令执行
SQLite是世界上使用最多的数据库之一.然而,关于其安全方面的研究,都只涉及WebSQL和浏览器开发方面.我们相信这只是SQLite安全的冰山一角. 在对SQLite安全性的长期研究中,我们尝试在任 ...
- python调用access数据库_Python3.7 pyodbc完美配置访问access数据库
环境 win2008 r2 64为系统 python3.7.pyodbc 安装好python3.7以后,那么就需要安装pyodbc了. 数据库连接 数据库连接网上大致有两种方法,一种是使用pyodbc ...
- Sql Server导入Access数据库报不可识别的数据库格式 Microsoft JET Database Engine
解决办法: 1.mdb 数据库转成 sql脚本 放在 sqlserver 运行一次就好了 2.在Access的Sql Server[升迁向导]中升迁为Sql Server然后导入
- 利用SQL语句查找某数据库中所有存储过程包含的内容
查找存储过程包含内容 Use 数据库 DECLARE @ProcName varchar(50) Create Table #tmpName(Content varchar(2000)) Creat ...
- access update语句执行_SQL Server与Access数据库sql语法十大差异
本文总结了SQL Server与Access数据库sql语法的十大差异. ACCESS结构简单容易处理,而且也能满足多数的应用程序要求,也是初学者的试牛刀. 随着时间的推移,大多数数据库应用程序都会发 ...
最新文章
- python能做什么项目好-python能做什么项目
- 三元运算 三个数取最大的
- 一个flash网页图片播放器
- C++ 易混淆的概念-sizeof和strlen、char* 和char[]、*p++和(*p)++
- parceljs 中文文档24小时诞生记
- 在开源UOJ的导航栏中添加新页面链接
- Java网络编程之IP地址
- 关于文件、文件夹加密隐藏原理的一点想法
- mysql先进后出_栈、队列中“先进先出”,“后进先出”的含义
- git启动linux系统,gitlab 开机自动启动配置
- 2021年中国宽带接入情况、用户规模及使用情况分析[图]
- 用Excel进行频域分析
- C++11时代的标准库快餐教程(4) - 排序算法的应用
- Synchronized 用法总结
- eos节点服务器_EOS柚子生态投票的骗局,你以为自己在区块恋革命,其实是在参与CX罢了...
- CCF之小明上学——2018.12 第一题 (java满分代码)
- Python3 面向对象基础1
- 逆向中常见寄存器及常用汇编指令
- python单一数字取对数与数列取对数
- 深入理解Golang之Map