1.首先,要用#import语句来引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序 (DLL、EXE等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado15.dll的附属资源中,只需要直接用 #import引用它既可。可以直接在Stdafx.h文件中加入下面语句来实现:
  1. #import "c:/program files/common files/system/ado/msado15.dll" no_namespace rename("EOF", "adoEOF")
【注意,在MFC中路径要用"/"或者"//"】
其中路径名可以根据自己系统安装的ADO支持文件的路径来自 行设定。当编译器遇到#import语句时,它会为引用组件类型库中的接口生成包装类,#import语句实际上相当于执行了API涵数 LoadTypeLib()。#import语句会在工程可执行程序输出目录中产生两个文件,分别为*.tlh(类型库头文件)及*.tli(类型库实现 文件),它们分别为每一个接口产生智能指针,并为各种接口方法、枚举类型,CLSID等进行声明,创建一系列包装方法。语句no_namespace说明 ADO对象不使用命名空间,rename ("EOF", "adoEOF")说明将ADO中结束标志EOF改为adoEOF,以避免和其它库中命名相冲突。
    2.其次,在程序初始过程中需要初始化组件,一般可以用CoInitialize(NULL);来实现,这种方法在结束时要关闭初始化的COM,可以用下 面语句CoUnInitialize();来实现。在MFC中还可以采用另一种方法来实现初始化COM,这种方法只需要一条语句便可以自动为我们实现初始 化COM和结束时关闭COM的操作,语句如下所示:
  1. AfxOleInit();

3.接着,就可以直接使用ADO的操作了。我们经常使用的只是前面用#import语句引用类型库时,生成的包装类.tlh中声明的智能指针中的三个,它 们分别是_ConnectionPtr、_RecordsetPtr和_CommandPtr。下面分别对它们的使用方法进行介绍:
_ConnectionPtr接 口返回一个记录集或一个空指针。通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。使用 _ConnectionPtr接口返回一个记录集不是一个好的使用方法。对于要返回记录的操作通常用_RecordserPtr来实现。而用 _ConnectionPtr操作时要想得到记录条数得遍历所有记录,而用_RecordserPtr时不需要。
    _CommandPtr接 口返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,你可以利用全局 _ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。如果你只执行一次或几次数据访问操作,后者是比较好的选择。但 如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用_CommandPtr 接口执行存储过程和SQL语句。
    _RecordsetPtr是一 个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。同_CommandPtr接口一样,它不一定要使用一个已 经创建的数据连接,可以用一个连接串代替连接指针赋给 _RecordsetPtr的connection成员变量,让它自己创建数据连接。如果你要使用多个记录集,最好的方法是同Command对象一样使用 已经创建了数据连接的全局_ConnectionPtr接口,然后使用_RecordsetPtr执行存储过程和SQL语句。

特别声明:如果是MFC程序,则初始化ado组件就不需要用CoInitialize(NULL), 只需要在**App::InitInstance()函数中调用AfxOleInit();即可:例如:

  1. BOOL CMyAdoTestApp::InitInstance()
  2. {
  3. if(!AfxOleInit())//这就是初始化COM库
  4. {
  5. AfxMessageBox(“OLE初始化出错!”);
  6. return FALSE;
  7. }

创建一个对话框程序。新建一个名为ADOConn的类,在头文件中导入msado15.dll

语句如下:

  1. #import "C:/Program Files/Common Files/System/ado/msado15.dll" no_namespace
  2. rename("EOF","adoEOF")rename("BOF","adoBOF")

这句话主要作用是引入ADO类库。

1:在ADOConn.h头文件中为类添加变量和初始化函数

  1. //添加一个指向Connection的指针
  2. _ConnectionPtr m_pConnection;
  3. //添加一个指向Recordset对象的指针
  4. _RecordsetPtr m_pRecordset;
  5. void ADOConn::OnInitADOConn()
  6. {
  7. //初始化OLE/COM库环境
  8. ::CoInitialize(NULL);
  9. try
  10. {
  11. //´创建connection连接对象
  12. m_pConnection.CreateInstance("ADODB.Connection");
  13. //设置连接字符串
  14. _bstr_t strConnect="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security
  15. Info=False;Initial Catalog=data;Data Source=.";
  16. //SERVER和UID,PWD的设定需要根据自己的情况
  17. m_pConnection->Open(strConnect,"","",adModeUnknown);
  18. }
  19. //捕捉异常
  20. catch(_com_error e)
  21. {
  22. //显示错误信息
  23. AfxMessageBox(e.Description());
  24. }
  25. }

2:为ADOConn类添加GetRecordSet的函数,目的是打开并获得记录集,代码如下:

  1. _RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL)
  2. {
  3. try
  4. {
  5. //连接数据库,如果connection为空则重新连接
  6. if(m_pConnection==NULL)
  7. OnInitADOConn();
  8. //创建记录集对象
  9. m_pRecordset.CreateInstance(__uuidof(Recordset));
  10. //取得表中的记录
  11. m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),
  12. adOpenDynamic,adLockOptimistic,adCmdText);
  13. }
  14. catch(_com_error e)
  15. {
  16. e.Description();
  17. }
  18. //返回记录集
  19. return m_pRecordset;
  20. }

3:在ADOConn类中添加ExecteSQL函数,目的是用来执行SQL语句,代码如下:

  1. BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL)
  2. {
  3. _variant_t RecordsAffected;
  4. try
  5. {
  6. //是否连接上数据库
  7. if(m_pConnection==NULL)
  8. OnInitADOConn();
  9. m_pConnection->Execute(bstrSQL,NULL,adCmdText);//adCmdText文本命令
  10. return true;
  11. }
  12. catch(_com_error e)
  13. {
  14. e.Description();
  15. return false;
  16. }
  17. }

4:设置退出记录集类

  1. void ADOConn::ExitConnect()
  2. {
  3. //关闭记录集和连接
  4. if(m_pRecordset!=NULL)
  5. m_pRecordset->Close();
  6. m_pConnection->Close();
  7. }

5:为对话框添加一个ListControl控件按钮,并设置属性为Report

为ListControl控件关联一个对象CListCtrl m_grid;

在初始化对话框函数里面添加

  1. //设置ListControl控件的风格
  2. m_grid.SetExtendedStyle(LVS_EX_FLATSB
  3. |LVS_EX_FULLROWSELECT
  4. |LVS_EX_HEADERDRAGDROP
  5. |LVS_EX_ONECLICKACTIVATE
  6. |LVS_EX_GRIDLINES);
  7. m_grid.InsertColumn(0,"编号",LVCFMT_LEFT,100,0);
  8. m_grid.InsertColumn(1,"姓名",LVCFMT_LEFT,100,1);
  9. m_grid.InsertColumn(2,"性别",LVCFMT_LEFT,100,2);
  10. ADOConn m_AdoConn;
  11. m_AdoConn.OnInitADOConn();
  12. CString sql;
  13. sql.Format("select* from employees order by 编号 desc");
  14. _RecordsetPtr m_pRecordset;
  15. m_pRecordset = m_AdoConn.GetRecordSet((_bstr_t)sql);
  16. while(m_AdoConn.m_pRecordset->adoEOF==0)//EOF判断是否到末尾
  17. {
  18. m_grid.InsertItem(0,"");
  19. m_grid.SetItemText(0,0,(char*)(_bstr_t)m_pRecordset->GetCollect("编号"));
  20. m_grid.SetItemText(0,1,(char*)(_bstr_t)m_pRecordset->GetCollect("姓名"));
  21. m_grid.SetItemText(0,2,(char*)(_bstr_t)m_pRecordset->GetCollect("性别"));
  22. m_pRecordset->MoveNext();
  23. }
  24. m_AdoConn.ExitConnect();//断开数据库连接

6:添加数据.

在对话框添加两个EditBox控件和一个Combox控件和一个按钮控件

如下图:

关联对象如下

  1. CString m_id,m_name;CComboBox m_combo;
  2. //在初始化中添加
  3. m_combo.InsertString(0,"男");
  4. m_combo.InsertString(1,"女");
  5. m_combo.SetCurSel(0);
  6. //按钮响应事件:
  7. UpdateData(true);
  8. if(m_id.IsEmpty())
  9. {
  10. MessageBox("编号不能为空");
  11. return;
  12. }
  13. if(m_name.IsEmpty())
  14. {
  15. MessageBox("姓名不能为空");
  16. return;
  17. }
  18. ADOConn m_AdoConn;
  19. m_AdoConn.OnInitADOConn();
  20. _bstr_t sql;
  21. sql = "select*from employees";
  22. _RecordsetPtr m_pRecordset;
  23. m_pRecordset=m_AdoConn.GetRecordSet(sql);
  24. CString sex;
  25. m_combo.GetLBText(m_combo.GetCurSel(),sex);
  26. try
  27. {
  28. m_pRecordset->AddNew();//添加新行
  29. m_pRecordset->PutCollect("编号",(_bstr_t)m_id);
  30. m_pRecordset->PutCollect("姓名",(_bstr_t)m_name);
  31. m_pRecordset->PutCollect("性别",(_bstr_t)sex);
  32. m_AdoConn.ExitConnect();
  33. }
  34. catch(...)
  35. {
  36. MessageBox("操作失败");
  37. return;
  38. }
  39. MessageBox("保存成功");
  40. m_grid.DeleteAllItems();
  41. AddToGrid();//这个是用来显示数据的,就是第八步初始化中的代码

7 修改记录集

在添加一个EditBox控件,关联对象CString m_old;用来保存,修改之前的编号;

添加修改按钮,并响应事件,代码如下:

  1. UpdateData(true);
  2. if(m_name.IsEmpty())
  3. {
  4. MessageBox("姓名不能为空");
  5. return;
  6. }
  7. ADOConn m_AdoConn;
  8. m_AdoConn.OnInitADOConn();
  9. _bstr_t sql;
  10. sql = "select*from employees";
  11. _RecordsetPtr m_pRecordset;
  12. m_pRecordset=m_AdoConn.GetRecordSet(sql);
  13. CString sex;
  14. m_combo.GetLBText(m_combo.GetCurSel(),sex);
  15. try
  16. {
  17. m_pRecordset->Move((long)pos,vtMissing);
  18. m_pRecordset->PutCollect("编号",(_bstr_t)m_id);
  19. m_pRecordset->PutCollect("姓名",(_bstr_t)m_name);
  20. m_pRecordset->PutCollect("性别",(_bstr_t)sex);
  21. m_pRecordset->Update();
  22. m_AdoConn.ExitConnect();
  23. }
  24. catch(...)
  25. {
  26. MessageBox("操作失败");
  27. return;
  28. }
  29. MessageBox("操作成功");
  30. m_grid.DeleteAllItems();
  31. AddToGrid();
  32. 8:删除记录集
  33. UpdateData(true);
  34. ADOConn m_AdoConn;
  35. m_AdoConn.OnInitADOConn();
  36. _bstr_t sql;
  37. sql = "select*from employees";
  38. _RecordsetPtr m_pRecordset;
  39. m_pRecordset=m_AdoConn.GetRecordSet(sql);
  40. CString m_id;
  41. try
  42. {
  43. m_pRecordset->Move(pos,vtMissing);
  44. m_pRecordset->Delete(adAffectCurrent);
  45. m_pRecordset->Update();
  46. m_AdoConn.ExitConnect();
  47. }
  48. catch(...)
  49. {
  50. MessageBox("操作失败");
  51. return;
  52. }
  53. MessageBox("删除成功.");
  54. m_grid.DeleteAllItems();
  55. AddToGrid();

以上总结了,SQL连接四种基本操作

VC++ MFC SQL ADO数据库访问技术使用的基本步骤及方法的更多相关文章

  1. C#-数据库访问技术 ado.net——创建 数据库连接类 与 数据库操作方法 以及简单的数据的添加、删除、修改、查看

    数据库访问技术 ado.net 将数据库中的数据,提取到内存中,展示给用户看还可以将内存中的数据写入数据库中去 并不是唯一的数据库访问技术,但是它是最底层的数据库访问技术 1.创建数据库,并设置主外键 ...

  2. C#与数据库访问技术总结(十八)

    ADO.NET 代码综合示例 前面已经介绍过OLE DB.NET和SQL Server.NET数据提供者可以用来连接不同的数据源. 以下代码不仅综合演示了使用ADO.NET的这两种数据提供者访问数据库 ...

  3. SQL Server数据库应用技术

    SQL Server数据库应用技术 SQL是Structured Query Language的缩写.SQL是操作命令集,是一种功能齐全的数据库语言.SQL功能强大.简单.易学.使用方便,已经成为了数 ...

  4. .NET客户端下载SQL Server数据库中文件流保存的大电子文件方法(不会报内存溢出异常)

    .NET客户端下载SQL Server数据库中文件流保存的大电子文件方法(不会报内存溢出异常) 前段时间项目使用一次性读去SQL Server中保存的电子文件的文件流然后返回给客户端保存下载电子文件, ...

  5. ADO.NET数据库访问技术(转)

    这几天的自学,现在总结一下关于C#中连接数据库的一些知识点: 1.使用Connection连接数据库的步骤: (1).添加命名空间 System.Data.SqlClient(注意:初学者经常会忘记) ...

  6. c# 窗体开发4 数据库访问技术

    ADO.NET的名称起源于ADO(ACTIVEX DATA OBJECTS) USING SYSTEM; USING SYSTEM.COLLECTIONS.GENERIC; USING SYSTEM. ...

  7. 数据库访问技术 odbc dao rdo uda jet oledb

    一.UDA(UniversalDataAccess) 这是微软提供的通用数据访问策略.包括ADO.OLEDB和ODBC.它不光提供了数据库的访 问能力,对于其它的数据存储技术也同样支持,如目录服务.E ...

  8. C#与数据库访问技术总结(十六)之 DataSet对象

    DataSet对象 DataSet对象可以用来存储从数据库查询到的数据结果,由于它在获得数据或更新数据后立即与数据库断开,所以程序员能用此高效地访问和操作数据库. 并且,由于DataSet对象具有离线 ...

  9. C#与数据库访问技术总结(十五)之 DataAdapter对象代码示例

    DataAdapter对象代码示例 下面的代码将说明如何利用DataAdapter对象填充DataSet对象. private static string strConnect=" data ...

随机推荐

  1. 小米智能家居接入智能家居平台homeassistant的方法

    [原文] 在安装和设置完homeassistant之后,我们终于来到激动人心的一步——把智能家居产品接入homeassistant了.把智能家居产品接入homeassistant智能家居平台之后,就可 ...

  2. scala学习手记14 - 单例对象

    java中的单例模式都很熟悉了:简单地说就是一个类只能有一个实例.在scala中创建单例对象非常简单,创建类时使用object关键字替换class即可.因为单例类无法初始化,所以不能向它的主构造函数传 ...

  3. Treflection06_调用静态方法

    1. package reflectionZ; import java.lang.reflect.Method; public class Treflection06 { public static ...

  4. ROC 曲线,以及AUC计算方式

    ROC曲线: roc曲线:接收者操作特征(receiveroperating characteristic),roc曲线上每个点反映着对同一信号刺激的感受性. ROC曲线的横轴: 负正类率(false ...

  5. 虚拟主机(多站点配置)的实现--centos上的实现

    Apache中配置多主机多站点,可以通过两种方式实现 将同一个域名的不同端口映射到不同的站点(虚拟主机) 将同一个端口映射成不同的域名,不同的域名映射到不同的站点 两种方法可以同时存在,局域网通过   ...

  6. python中的mysql操作

    一. 数据库在自动化测试中的应用 存测试数据 有的时候大批量的数据,我们需要存到数据库中,在测试的时候才能用到,测试的时候就从数据库中读取出来.这点是非常重要的! 存测试结果 二. python中的数 ...

  7. 四十七 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索的自动补全功能

    elasticsearch(搜索引擎)提供了自动补全接口 官方说明:https://www.elastic.co/guide/en/elasticsearch/reference/current/se ...

  8. 三十五 Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy分布式爬虫要点

    1.分布式爬虫原理 2.分布式爬虫优点 3.分布式爬虫需要解决的问题

  9. HDU6071-最短路

    http://acm.hdu.edu.cn/showproblem.php?pid=6071 四个点围成一个环,相邻两点之间存在路径,问从2号点出发最后再次回到二号点,在路程大于等于K的情况下的最小路 ...

  10. HDU-4510-日期

    http://acm.hdu.edu.cn/showproblem.php?pid=4510 小Q系列故事——为什么时光不能倒流 Time Limit: 300/100 MS (Java/Others ...