昨天晚上学MFC的ADO,跟着书上的讲解和例子,完成了ADO的初级使用。首先,在使用ADO变成之前,必须做必要的配置。在工程文件StdAfx.h的代码最后,添加一句配置代码,代码如下:[cpp] view plaincopyprint?#import "C:/Program Files/Common Files/System/ado/msado15.dll" no_namespace/ rename("EOF","DB_EOF")rename("BOF","DB_BOF") //导入ADO动态链接库 #import "C:/Program Files/Common Files/System/ado/msado15.dll" no_namespace/ rename("EOF","DB_EOF")rename("BOF","DB_BOF") //导入ADO动态链接库 然后,在工程中的应用程序类xxxApp的BOOL CxxxApp::InitInstance()函数中初始化COM环境。也就是在该函数中加入一句代码,代码如下:[cpp] view plaincopyprint?CoInitialize(NULL);//初始化COM环境 CoInitialize(NULL);//初始化COM环境当以上配置完全后,可以进行ADO操作,由于数据库操作方法类似,可以将数据库操作封装到某个ADO的类中,让每个需要ADO操作的类对其进行调用。这里,直接使用书籍上的实例代码,代码如下:DBBase.h[cpp] view plaincopyprint?// DBBase.h: interface for the DBBase class. // // #if !defined(AFX_DBBASE_H__08DE1FB3_6716_4CAD_B119_252BE6F58101__INCLUDED_) #define AFX_DBBASE_H__08DE1FB3_6716_4CAD_B119_252BE6F58101__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class DBBase { public: DBBase(); virtual ~DBBase(); void OnInitADOConn(); _RecordsetPtr& OpenRecordset(CString sql); //打开记录集 void CloseRecordset(); void CloseConn(); UINT GetRecordsetCount(_RecordsetPtr pRecrodset);//获得记录数 public: _ConnectionPtr m_pConnection; _RecordsetPtr m_pRecordset; }; #endif // !defined(AFX_DBBASE_H__08DE1FB3_6716_4CAD_B119_252BE6F58101__INCLUDED_) // DBBase.h: interface for the DBBase class.#if !defined(AFX_DBBASE_H__08DE1FB3_6716_4CAD_B119_252BE6F58101__INCLUDED_)#define AFX_DBBASE_H__08DE1FB3_6716_4CAD_B119_252BE6F58101__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000class DBBase {public:DBBase();virtual ~DBBase();void OnInitADOConn();_RecordsetPtr& OpenRecordset(CString sql); //打开记录集void CloseRecordset();void CloseConn();UINT GetRecordsetCount(_RecordsetPtr pRecrodset);//获得记录数public:_ConnectionPtr m_pConnection;_RecordsetPtr m_pRecordset;};#endif // !defined(AFX_DBBASE_H__08DE1FB3_6716_4CAD_B119_252BE6F58101__INCLUDED_) DBBase.cpp[cpp] view plaincopyprint?// DBBase.cpp: implementation of the DBBase class. // // #include "stdafx.h" #include "ADO.h" #include "DBBase.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif // // Construction/Destruction // DBBase::DBBase() { } DBBase::~DBBase() { } void DBBase::OnInitADOConn() { ::CoInitialize(NULL); try { m_pConnection.CreateInstance("ADODB.Connection"); //创建连接对象实例 _bstr_t strConnect="DRIVER={Microsoft Access Driver (*.mdb)};/ uid=;pwd=;DBQ=DataBase.mdb;"; m_pConnection->Open(strConnect,"","",adModeUnknown); //打开数据库 } catch(_com_error e) { AfxMessageBox(e.Description()); //弹出错误处理 } } _RecordsetPtr& DBBase::OpenRecordset(CString sql) { ASSERT(!sql.IsEmpty()); //SQL语句不能为空 try { m_pRecordset.CreateInstance(__uuidof(Recordset)); //创建记录集对象实例 m_pRecordset->Open(_bstr_t(sql), m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText); //执行SQL得到记录集 } catch(_com_error e) //捕获可能的异常 { AfxMessageBox(e.Description()); } return m_pRecordset; } void DBBase::CloseRecordset() { if(m_pRecordset->GetState() == adStateOpen) //判断当前的记录集状态 m_pRecordset->Close(); //关闭记录集 } void DBBase::CloseConn() { m_pConnection->Close(); //关闭数据库连接 ::CoUninitialize(); //释放COM环境 } UINT DBBase::GetRecordsetCount(_RecordsetPtr pRecordset) { int nCount = 0; //声明保存记录数的变量 try{ pRecordset->MoveFirst(); //将记录集指针移动到第一条记录 } catch(...) //捕捉可能出现的错误 { return 0; //产生错误时返回0 } if(pRecordset->DB_EOF) //判断记录集中是否没有记录 return 0; //无记录时返回0 while (!pRecordset->DB_EOF) //当记录集指针没有指向最后时 { pRecordset->MoveNext(); //将记录集指针移动到下一条记录 nCount = nCount + 1; //记录个数的变量加1 } pRecordset->MoveFirst(); //将记录集指针移动到第一条记录 return nCount; //返回记录数 } // DBBase.cpp: implementation of the DBBase class.#include "stdafx.h"#include "ADO.h"#include "DBBase.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif Construction/Destruction//DBBase::DBBase(){}DBBase::~DBBase(){}void DBBase::OnInitADOConn(){::CoInitialize(NULL);try{ m_pConnection.CreateInstance("ADODB.Connection"); //创建连接对象实例 _bstr_t strConnect="DRIVER={Microsoft Access Driver (*.mdb)};/uid=;pwd=;DBQ=DataBase.mdb;"; m_pConnection->Open(strConnect,"","",adModeUnknown); //打开数据库}catch(_com_error e){AfxMessageBox(e.Description()); //弹出错误处理}}_RecordsetPtr& DBBase::OpenRecordset(CString sql){ASSERT(!sql.IsEmpty()); //SQL语句不能为空try{m_pRecordset.CreateInstance(__uuidof(Recordset)); //创建记录集对象实例m_pRecordset->Open(_bstr_t(sql), m_pConnection.GetInterfacePtr(),adOpenDynamic, adLockOptimistic, adCmdText); //执行SQL得到记录集}catch(_com_error e) //捕获可能的异常{AfxMessageBox(e.Description());}return m_pRecordset;}void DBBase::CloseRecordset(){if(m_pRecordset->GetState() == adStateOpen) //判断当前的记录集状态m_pRecordset->Close(); //关闭记录集}void DBBase::CloseConn(){m_pConnection->Close(); //关闭数据库连接::CoUninitialize(); //释放COM环境}UINT DBBase::GetRecordsetCount(_RecordsetPtr pRecordset){int nCount = 0; //声明保存记录数的变量try{pRecordset->MoveFirst(); //将记录集指针移动到第一条记录}catch(...) //捕捉可能出现的错误{return 0; //产生错误时返回0}if(pRecordset->DB_EOF) //判断记录集中是否没有记录return 0; //无记录时返回0while (!pRecordset->DB_EOF) //当记录集指针没有指向最后时{pRecordset->MoveNext(); //将记录集指针移动到下一条记录nCount = nCount + 1; //记录个数的变量加1}pRecordset->MoveFirst(); //将记录集指针移动到第一条记录return nCount; //返回记录数}以上工作做好后,我们可以进行ADO的增删改查了,这里,仅将函数代码贴出,具体代码理解看个人能力:增加数据:[cpp] view plaincopyprint?void CADODlg::OnBtnAdd() { // TODO: Add your control notification handler code here UpdateData(TRUE); if(m_id.IsEmpty() || m_name.IsEmpty() || m_culture.IsEmpty() || m_test.IsEmpty()) { MessageBox("基础信息不能为空!"); return; } DBBase m_DBBase; m_DBBase.OnInitADOConn(); CString sql = "select * from employees"; m_DBBase.m_pRecordset = m_DBBase.OpenRecordset(sql); try { m_DBBase.m_pRecordset->AddNew(); m_DBBase.m_pRecordset->PutCollect("编号",(_bstr_t)m_id); m_DBBase.m_pRecordset->PutCollect("姓名",(_bstr_t)m_name); m_DBBase.m_pRecordset->PutCollect("学历",(_bstr_t)m_culture); m_DBBase.m_pRecordset->PutCollect("测试",(_bstr_t)m_test); m_DBBase.m_pRecordset->Update(); m_DBBase.CloseRecordset(); m_DBBase.CloseConn(); } catch(...) { MessageBox("数据库操作失败!"); return; } MessageBox("数据库添加数据成功!"); m_grid.DeleteAllItems(); AddToGrid(); } void CADODlg::OnBtnAdd() {// TODO: Add your control notification handler code hereUpdateData(TRUE);if(m_id.IsEmpty() || m_name.IsEmpty() || m_culture.IsEmpty() || m_test.IsEmpty()){MessageBox("基础信息不能为空!");return;}DBBase m_DBBase;m_DBBase.OnInitADOConn();CString sql = "select * from employees";m_DBBase.m_pRecordset = m_DBBase.OpenRecordset(sql);try{m_DBBase.m_pRecordset->AddNew();m_DBBase.m_pRecordset->PutCollect("编号",(_bstr_t)m_id);m_DBBase.m_pRecordset->PutCollect("姓名",(_bstr_t)m_name);m_DBBase.m_pRecordset->PutCollect("学历",(_bstr_t)m_culture);m_DBBase.m_pRecordset->PutCollect("测试",(_bstr_t)m_test);m_DBBase.m_pRecordset->Update();m_DBBase.CloseRecordset();m_DBBase.CloseConn();}catch(...){MessageBox("数据库操作失败!");return;}MessageBox("数据库添加数据成功!");m_grid.DeleteAllItems();AddToGrid();}修改数据:[cpp] view plaincopyprint?void CADODlg::OnBtnEdit() { // TODO: Add your control notification handler code here UpdateData(TRUE); if(m_id.IsEmpty() || m_name.IsEmpty() || m_culture.IsEmpty() || m_test.IsEmpty()) { MessageBox("基础信息不能为空!"); return; } int pos = m_grid.GetSelectionMark(); DBBase m_dbBase; m_dbBase.OnInitADOConn(); CString sql = "select * from employees"; m_dbBase.m_pRecordset = m_dbBase.OpenRecordset(sql); try { m_dbBase.m_pRecordset->Move(pos, vtMissing); m_dbBase.m_pRecordset->PutCollect("编号", (_bstr_t)m_id); m_dbBase.m_pRecordset->PutCollect("姓名", (_bstr_t)m_name); m_dbBase.m_pRecordset->PutCollect("学历", (_bstr_t)m_culture); m_dbBase.m_pRecordset->PutCollect("测试", (_bstr_t)m_test); m_dbBase.m_pRecordset->Update(); m_dbBase.CloseRecordset(); m_dbBase.CloseConn(); } catch(...) { MessageBox("修改数据失败!如果没有选中数据,请先选中!"); return; } MessageBox("修改数据成功!"); m_grid.DeleteAllItems(); AddToGrid(); } void CADODlg::OnBtnEdit() {// TODO: Add your control notification handler code hereUpdateData(TRUE);if(m_id.IsEmpty() || m_name.IsEmpty() || m_culture.IsEmpty() || m_test.IsEmpty()){MessageBox("基础信息不能为空!");return;}int pos = m_grid.GetSelectionMark();DBBase m_dbBase;m_dbBase.OnInitADOConn();CString sql = "select * from employees";m_dbBase.m_pRecordset = m_dbBase.OpenRecordset(sql);try{m_dbBase.m_pRecordset->Move(pos, vtMissing);m_dbBase.m_pRecordset->PutCollect("编号", (_bstr_t)m_id);m_dbBase.m_pRecordset->PutCollect("姓名", (_bstr_t)m_name);m_dbBase.m_pRecordset->PutCollect("学历", (_bstr_t)m_culture);m_dbBase.m_pRecordset->PutCollect("测试", (_bstr_t)m_test);m_dbBase.m_pRecordset->Update();m_dbBase.CloseRecordset();m_dbBase.CloseConn();}catch(...){MessageBox("修改数据失败!如果没有选中数据,请先选中!");return;}MessageBox("修改数据成功!");m_grid.DeleteAllItems();AddToGrid();} 删除数据:[cpp] view plaincopyprint?void CADODlg::OnBtnDel() { // TODO: Add your control notification handler code here int pos = m_grid.GetSelectionMark(); DBBase dbBase; dbBase.OnInitADOConn(); CString sql = "select * from employees"; dbBase.m_pRecordset = dbBase.OpenRecordset(sql); try { dbBase.m_pRecordset->Move(pos, vtMissing); dbBase.m_pRecordset->Delete(adAffectCurrent); dbBase.m_pRecordset->Update(); dbBase.CloseRecordset(); dbBase.CloseConn(); } catch(...) { MessageBox("删除数据失败!如果没有选中数据,请先选中!"); return; } MessageBox("删除数据成功!"); OnBtnClean(); m_grid.DeleteAllItems(); AddToGrid(); } void CADODlg::OnBtnDel() {// TODO: Add your control notification handler code hereint pos = m_grid.GetSelectionMark();DBBase dbBase;dbBase.OnInitADOConn();CString sql = "select * from employees";dbBase.m_pRecordset = dbBase.OpenRecordset(sql);try{dbBase.m_pRecordset->Move(pos, vtMissing);dbBase.m_pRecordset->Delete(adAffectCurrent);dbBase.m_pRecordset->Update();dbBase.CloseRecordset();dbBase.CloseConn();}catch(...){MessageBox("删除数据失败!如果没有选中数据,请先选中!");return;}MessageBox("删除数据成功!");OnBtnClean();m_grid.DeleteAllItems();AddToGrid();} 查找数据:[cpp] view plaincopyprint?void CSearchDlg::OnBtnSearch() { // TODO: Add your control notification handler code here UpdateData(TRUE); CString m_field; int pos = 0; if(m_combField.GetCurSel() == -1) pos = 0; m_combField.GetLBText(pos, m_field); if(m_content.IsEmpty() && m_field != "-1") { MessageBox("请填写要检索的数据"); return; } DBBase dbBase; CString sql = "select * from employees order by '编号' desc"; dbBase.OnInitADOConn(); dbBase.OpenRecordset(sql); CString str_search; str_search.Format("%s = '%s'", m_field, m_content); dbBase.m_pRecordset->Filter = (_bstr_t)str_search; dbBase.m_pRecordset->Requery(0); m_grid.DeleteAllItems(); int i = 0; while(!dbBase.m_pRecordset->DB_EOF) { m_grid.InsertItem(i, ""); m_grid.SetItemText(i, 0, (char *)(_bstr_t)dbBase.m_pRecordset->GetCollect("编号")); m_grid.SetItemText(i, 1, (char *)(_bstr_t)dbBase.m_pRecordset->GetCollect("姓名")); m_grid.SetItemText(i, 2, (char *)(_bstr_t)dbBase.m_pRecordset->GetCollect("学历")); m_grid.SetItemText(i, 3, (char *)(_bstr_t)dbBase.m_pRecordset->GetCollect("测试")); dbBase.m_pRecordset->MoveNext(); i++; } dbBase.CloseRecordset(); dbBase.CloseConn(); } void CSearchDlg::OnBtnSearch() {// TODO: Add your control notification handler code hereUpdateData(TRUE);CString m_field;int pos = 0;if(m_combField.GetCurSel() == -1)pos = 0;m_combField.GetLBText(pos, m_field); if(m_content.IsEmpty() && m_field != "-1"){MessageBox("请填写要检索的数据");return;}DBBase dbBase;CString sql = "select * from employees order by '编号' desc";dbBase.OnInitADOConn();dbBase.OpenRecordset(sql);CString str_search;str_search.Format("%s = '%s'", m_field, m_content);dbBase.m_pRecordset->Filter = (_bstr_t)str_search;dbBase.m_pRecordset->Requery(0);m_grid.DeleteAllItems();int i = 0;while(!dbBase.m_pRecordset->DB_EOF){m_grid.InsertItem(i, "");m_grid.SetItemText(i, 0, (char *)(_bstr_t)dbBase.m_pRecordset->GetCollect("编号"));m_grid.SetItemText(i, 1, (char *)(_bstr_t)dbBase.m_pRecordset->GetCollect("姓名"));m_grid.SetItemText(i, 2, (char *)(_bstr_t)dbBase.m_pRecordset->GetCollect("学历"));m_grid.SetItemText(i, 3, (char *)(_bstr_t)dbBase.m_pRecordset->GetCollect("测试"));dbBase.m_pRecordset->MoveNext();i++;}dbBase.CloseRecordset();dbBase.CloseConn();}以上代码中,均会使用到AddToGrid()函数,主要是将数据填充到列表视图控件中去,该函数代码为:[cpp] view plaincopyprint?void CSearchDlg::AddToGrid() { DBBase m_dbBase; m_dbBase.OnInitADOConn();//连接数据库 CString SQL = "select * from employees order by 编号 desc"; //设置查询字符串 m_dbBase.m_pRecordset = m_dbBase.OpenRecordset(SQL);//打开记录集 while(!m_dbBase.m_pRecordset->DB_EOF) { m_grid.InsertItem(0,""); m_grid.SetItemText(0,0,(char*)(_bstr_t)m_dbBase.m_pRecordset->GetCollect("编号")); m_grid.SetItemText(0,1,(char*)(_bstr_t)m_dbBase.m_pRecordset->GetCollect("姓名")); m_grid.SetItemText(0,2,(char*)(_bstr_t)m_dbBase.m_pRecordset->GetCollect("学历")); m_grid.SetItemText(0,3,(char*)(_bstr_t)m_dbBase.m_pRecordset->GetCollect("测试")); m_dbBase.m_pRecordset->MoveNext();//将记录集指针移动到下一条记录 } m_dbBase.CloseRecordset(); m_dbBase.CloseConn();//断开数据库连接 } void CSearchDlg::AddToGrid(){DBBase m_dbBase;m_dbBase.OnInitADOConn();//连接数据库CString SQL = "select * from employees order by 编号 desc"; //设置查询字符串m_dbBase.m_pRecordset = m_dbBase.OpenRecordset(SQL);//打开记录集while(!m_dbBase.m_pRecordset->DB_EOF){m_grid.InsertItem(0,"");m_grid.SetItemText(0,0,(char*)(_bstr_t)m_dbBase.m_pRecordset->GetCollect("编号"));m_grid.SetItemText(0,1,(char*)(_bstr_t)m_dbBase.m_pRecordset->GetCollect("姓名"));m_grid.SetItemText(0,2,(char*)(_bstr_t)m_dbBase.m_pRecordset->GetCollect("学历"));m_grid.SetItemText(0,3,(char*)(_bstr_t)m_dbBase.m_pRecordset->GetCollect("测试"));m_dbBase.m_pRecordset->MoveNext();//将记录集指针移动到下一条记录}m_dbBase.CloseRecordset();m_dbBase.CloseConn();//断开数据库连接} 至于OnBtnClean()函数则是将Edit控件的数据进行清除,代码如下:[cpp] view plaincopyprint?void CADODlg::OnBtnClean() { // TODO: Add your control notification handler code here m_id.Empty(); m_name.Empty(); m_culture.Empty(); m_test.Empty(); UpdateData(FALSE); } void CADODlg::OnBtnClean() {// TODO: Add your control notification handler code herem_id.Empty();m_name.Empty();m_culture.Empty();m_test.Empty();UpdateData(FALSE);} 注意:在做所有操作之前,需将数据先绑定到控件中

昨天晚上学MFC的ADO,跟着书上的讲解和例子,完成了ADO的初级使用。相关推荐

  1. 关于数据科学,书上不曾提及的三点经验

     关于数据科学,书上不曾提及的三点经验 发表于2015-09-10 23:33| 445次阅读| 来源Mikio L. Braun Blog| 0 条评论| 作者Mikio L. Braun 大数 ...

  2. ADO.NET的数据库查询2009-12-07 02:20 P.M.ADO.NET的数据库查询

    ADO.NET的数据库查询 2009-12-07 02:20 P.M. ADO.NET的数据库查询 一.SqlCommand对象 1:创建SqlCommand对象 l         使用New关键字 ...

  3. mysql查询今天,昨天,近7天,近30天,本月,上一月数据

    近期项目中用到了查询当月数据记录的功能,最初的想法是在逻辑业务里构造好时间段进行查询,当写sql语句时感觉挺麻烦.所以就到网上搜索了一下,看看是不是能有简单的方法.果然.网络资源非常强大.以下结合我的 ...

  4. 图解比较李航书上的viterbi算法和dijistra算法

    李航P184中有句话非常奇怪,是这样的: "根据动态规划原理,最优路径具有这样的特性:如果最优路径在时刻t通过节点it∗i_t^*it∗​,那么这一路径从节点it∗i_t^*it∗​到终点i ...

  5. 无论是cisco还是华三的书上对于子网划分有个问题需要解释

    无论是cisco还是华三的书上对于子网划分有个问题,例如:如果子网为有五位 ,则可以划分为30个子网.在实际中却不是这样的 子网位五位,可以划分为32个子网.那为什么这么写,难道是出书的人写错了,其实 ...

  6. 自学java编译老是出错_为什么按照书上的代码,编译老是出错?

    老是又小伙伴在群里说我的代码是按照书上的代码敲的,就是编译不过?想不通呀!目前市面上的一些书都是十来年以前编写的了,你不幸看的还是这些书,错误原因就在这里. 比如谭浩强的C语言程序设计这个本书都出了N ...

  7. 电脑字体模糊_小红书上传视频模糊?做小红书视频99%的工具都在这了

    到现在小红书视频号功能已经上线快三个月了,越来越多的小伙伴开始拍视频.创作视频笔记,但是对于新接触视频的小伙伴来说,拍摄视频好像是一件很难的事,特别是不清楚该选择什么拍摄设备.不知道怎么剪辑视频,还有 ...

  8. 飞书×帆软数知鸟 | 飞书上的一站式需求管理

    当我们说到飞书,大家应该都不陌生 飞书是一个高效协作的办公工具 可以一站式无缝办公协作 那你知道数知鸟平台吗? 数知鸟是帆软推出的高效数据需求管理平台 可以一站式需求管理 数知鸟遇到飞书,两个&quo ...

  9. 爬取某位大佬简书上所有文章并保存为pdf

    点击上方"AirPython",选择"置顶公众号" 第一时间获取 Python 技术干货! 阅读文本大概需要 8 分钟. 1 目 标 场 景 现如今,我们处于一 ...

最新文章

  1. 小程序 - 效果处理之技巧合集(更新中...)
  2. MobaXterm工具连接Linux服务器入门使用手册,国产化泰山服务器连接工具使用演示
  3. ​模型优化漫谈:BERT的初始标准差为什么是0.02?
  4. visio思维导图模板_如何下载思维导图模板?在线教你找精美漂亮的思维导图
  5. unittest所有断言方法
  6. 车牌号随机函数 php,模拟生成车牌号的程序.程序运行.生成十个随机的车牌子.......
  7. webmail lite php,自建webmail网页客户端
  8. loj136 (最小瓶颈路,多次询问)
  9. Linux系统下QT九宫格拼图小游戏
  10. 完整的连接器设计手册_工业连接器如何选型
  11. Git的安装步骤、配置(解决Git官网下载速度慢、无法下载,需要授权)
  12. VideoView源码分析
  13. 什么是爬虫?你了解吗,能干什么,怎么用,让你了解本质
  14. 微博是一种倒退,而非革命
  15. java调试步骤_Java程序的开发过程及基本调试方法
  16. WinRAR分割超大文件
  17. win10所有文件夹都是只读
  18. 一文聊透Netty核心引擎Reactor的运转架构
  19. 【方法】科大讯飞在线语音合成API使用-文字转语音音频
  20. 心灵震撼《一个8岁女孩的遗书》

热门文章

  1. 宿命传说2之女神召唤java_宿命传说2-女神的召唤
  2. pysimplegui 显示 html,PySimpleGUI 的第一个桌面软件
  3. Python风格总结:Python基础-类变量和实例变量
  4. 20190720学习小结
  5. 手动升级 Confluence - 规划你的升级
  6. 利用axios获取数据并渲染到视图层
  7. 联想陈旭东:我们有工匠精神
  8. 【Win10 应用开发】实现数据的增量加载
  9. JAVA 垃圾收集监控
  10. 常用数据结构有哪些(转)