在现代软件开发中,数据库技术被越来越广泛应用,很多项目都存在着大量的数据需要存储,通常都会采用数据库来存储这些数据。最初,数据库厂商推出一个新的数据库产品时,相应的,他会为程序员提供一套访问该数据库的接口,即API。不同的数据库厂商提供的访问接口是不一样的,这样在使用一个新的数据库时,就要学习一套新的API,当然这就加大了开发数据库的难度,也不利于数据库在软件开发过程中的应用。因此,后来Microsoft就推出了一些标准的访问数据库的技术。

这一部分主要介绍ADO访问数据库的情况,对于其它技术,可以自行查阅相应书籍,ADO中有以下3个核心对象。

@Connection对象

Connection对象表示到数据库的链接,它管理应用程序和数据库之间的通信,下面的2个对象都有一个ActiveConnection属性,该属性用来引用Connection对象。

@Command对象

Command对象用来 处理 重复执行的查询,或处理 需要检查 在存储过程中的输出或返回值 的查询。

@RecordSet对象

      RecordSet对象用来保存数据,存放查询的结果,这些结果由数据的行(记录)和列(字段)组成。每一列都存放在RecordSet的Fields集合中的一个Field对象中。

第一步:

在VC中利用ADO访问数据库时,首先需要导入ADO库。在程序的预编译头文件stdAfx.h中导入该库,方法是利用import指令将此动态链接库导入,具体代码如下:#import "c:/program files/common files/system/ado/msado15.dll" no_namespace rename("EOF","rsEOF"),代码中使用了no_namespace关键字,namespace是命名空间,本例中不需要命名空间,主要是为了访问方便,在程序中可以直接访问ADO提供的Connection、Command、RecordSet这3个COM接口。最后利用rename将EOF改为rsEOF。EOF表示 记录集 的结尾,因为文件也是以EOF为结尾的,为了避免冲突,在导入ADO库时,需要将EOF改为rsEOF。至于将其改为什么名字,可以根据自己的习惯来定。

在导入ADO库之后,编译程序,会出现一条警告,在VC中利用ADO访问数据库时都会存在这一警告,对程序并没有影响,可以不用理会。编译之后,在Debug目录下,可以看到编译器为我们产生了两个文件,msado15.tlh和msado15.tli。可以将msado15.tlh看作是一个头文件,msado15.tli看作是一个源文件,这两个文件是在导入ADO库之后,编译器在编译的时候自动生成的,利用ADO技术访问数据库并不需要为工程导入这两个文件。

第二步:

为需要访问数据库的类添加2个成员变量,_RecordsetPtr m_pRs(数据集对象);_ConnectionPtr m_pConn;(数据库链接对象)   接着在程序初始化的时候初始化这2个对象

  1. CoInitialize(NULL);
  2. try
  3. {
  4. //初始化数据库连接对象
  5. m_pConn.CreateInstance("ADODB.Connection");
  6. m_pRs.CreateInstance(__uuidof(Recordset));//这里必须初始化。
  7. //定义数据库连接字符串,打开本地Access库
  8. m_pConn->ConnectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=DBS.mdb;Persist Security Info=False";
  9. //打开数据库连接
  10. m_pConn->Open("","","",adConnectUnspecified);
  11. }
  12. catch(_com_error &e)
  13. {
  14. ::CoUninitialize();
  15. ::AfxMessageBox(e.ErrorMessage());
  16. return FALSE;
  17. }

COM组件在使用时,需要初始化COM库,这就需要调用CoInitialize(NULL);函数来实现,该函数有一个参数,该参数是保留的,直接传递NULL即可,同时在访问完COM库之后,程序需要调用CoUninitialize();函数卸载COM库。

接着,初始化 数据链接对象 和 数据集对象。在初始化这两个对象时,利用__uuidof获取ADO Connection和ADO RecordSet对象的全局唯一标识符(GUID)。对m_pConn对象进行初始化。

然后,利用智能指针对象去访问该对象的属性和方法了。首先,为数据库链接对象的链接字符串赋值。然后调用链接对象的Open方法打开与数据库的链接。关于链接字符串的获得:不必死记硬背,可以利用VB开发环境来得到链接字符串,P756。

接下来就可以利用链接对象的Execute方法来从数据库获得数据了。

  1. void CMy_DbsDlg::OnBtnQue()
  2. {
  3. try
  4. {
  5. CString strsql;
  6. strsql.Format("SELECT * FROM RoomStandard");
  7. HRESULT hr=m_pRs->Open(_variant_t(strsql),(m_pConn.GetInterfacePtr()),adOpenStatic,adLockOptimistic,adCmdText);
  8. //m_pRs=m_pConn->Execute((_bstr_t)strsql,NULL,adCmdText);
  9. _variant_t vFieldValue;
  10. if(SUCCEEDED(hr))
  11. {
  12. //m_pRs->MoveFirst();//移至第一条记录---------默认指针在第一条记录上
  13. m_list.DeleteAllItems();
  14. int i=0,n=0;
  15. while(!(m_pRs->GetrsEOF()))//while(!m_pRs->rsEOF)
  16. {
  17. int k=0;
  18. vFieldValue=m_pRs->GetCollect(_variant_t(long(k)));
  19. if(vFieldValue.vt!=NULL)
  20. {
  21. k=1;
  22. m_list.InsertItem(n,_bstr_t(vFieldValue));//插入列表控件
  23. for(;k<9;k++)
  24. {
  25. vFieldValue=m_pRs->GetCollect(_variant_t(long(k)));
  26. if(vFieldValue.vt!=NULL)
  27. {
  28. m_list.SetItemText(n,k,_bstr_t(vFieldValue));
  29. }
  30. }
  31. }
  32. n++;//记录数加1;
  33. m_pRs->MoveNext();
  34. }
  35. m_pRs->Close();
  36. }
  37. }
  38. catch(_com_error e)
  39. {
  40. AfxMessageBox(e.ErrorMessage());
  41. AfxMessageBox((LPCTSTR)(e.Description()));
  42. }
  43. ///////////////////////////////////////////
  44. //这里要判断一下记录是不是打开的,要以防不正常的情况下记录没有关闭!
  45. if(m_pRs)
  46. {
  47. if (m_pRs->State)
  48. {
  49. m_pRs->Close();
  50. }
  51. }
  52. }

当数据操作完成之后,调用记录集对象的Close方法关闭记录集,最后调用链接对象的Close方法关闭链接。然后还需要释放智能指针在COM接口上的引用计数,即分别调用记录集对象和链接对象的Release方法,该方法将释放相应COM接口的引用计数。智能指针有一个特点,在访问其它属性和方法时,都是用->操作符,但在调用Release方法释放引用计数时,必须使用.操作符。

vc访问ACCESS数据库的更多相关文章

  1. ADO访问Access数据库错误解决心得随笔

    最近在用ADO访问Access数据库的时候出现了一个奇怪的错误,觉得有必要记录下来,和大家分享一下. 环境 win7 x86系统: VS2012编译器: Office2010: Access2000~ ...

  2. [转载]Unity3D 访问Access数据库

    在开始这个小教程之前呢,其实在网上你已经可以找到相关的资料了,但是我还是要把我自己做练习的一点东西分享出来.写这个教程的主要原因呢,是一个朋友在u3d的官网论坛里,找到了这个demo,但是在他使用的过 ...

  3. Unity访问Access数据库

    首先,准备工作: 创建一个Access 数据库,命名AccessTest.accdb,添加一些数据用于测试 准备System.Data.dll与System.EnterpriseServices.dl ...

  4. 如何使用.net访问Access数据库 (转)

    前言:今天整理程序,看到之前写的一个Demo,也不知道是从哪里参考的了,写到这里,留作备用吧. 使用.net访问Access数据库:1.BL层:新增一个DataAccess类. Code].Defau ...

  5. Excel中使用VBA访问Access数据库

    VBA访问Access数据库 1. 通用自动化语言VBA VBA(Visual Basic For Application)是一种通用自动化语言,它可以使Excel中的常用操作自动化,还可以创建自定义 ...

  6. C#.NET ORM 如何访问 Access 数据库 [FreeSql]

    最近很多 .net QQ 群无故被封停,特别是 wpf 群几乎全军覆没.依乐祝的 .net6交流群,晓晨的 .net跨平台交流群,导致很多码友流离失所无家可归,借此机会使用一次召唤术,有需要的请加群: ...

  7. Jackcess 1.2.13 发布,Java 访问 Access 数据库

    Jackcess 1.2.13 包含新的方法用于在数据库和附件内容解码中查找复杂值类型的关系,修复了 CodeHandler 相关的一些小 bug. Jackcess 是一个Java 类库,用来读写微 ...

  8. golang ODBC 访问access数据库(问题解决之心理路程)

    最近项目需要,需要操作access,以前是用VC++ OLE访问,网络用ACE库,感觉很庞大...决定用go试试 网上用的最多的就是这个https://github.com/weigj/go-odbc ...

  9. 访问Access数据库(有多个数据库时 体现多态)

    如果想编写单机版MIS.小型网站等对数据库性能要求不高的系统,又不想安装SQLServer,可以使用Access(MDAC),只要一个mdb文件就可以了.使用Access创建mdb文件,建表.OleD ...

随机推荐

  1. Caffe python利用classify.py实现对单通道(灰度图)的数据进行分类

    比如你在mnist的prototxt中定义图输入是单通道的,也就是channel=1,然后如果直接调用classify.py脚本来测试的话,是会报错,错误跟一下类似. Source param sha ...

  2. eclipse中去掉警告提示

    有时候我们要去掉这些不必要的提示 下面我们来设置去掉这些警告提示

  3. JumpGame,JumpGame2

    JumpGame:给定一个非负整数数组,开始在第一个位置,每个位置上的数字代表最大可以跳跃的步数,判断能不能跳到最后一个位置. 例如:A=[2,3,1,1,4],在位置0处,可以跳一步到位置1,位置1 ...

  4. ZC_疑问

    1. 应该可以将所有的 jni需要的函数都放在一个 dll中(Windows下),然后 多个java项目就只要调用一个dll了. 可以测试一下 2.

  5. python学习笔记(异常处理)

    上次提到正则表达式 当未匹配到数据返回值 None 再使用 match.group 会出现异常 AttributeError 为了避免异常我改成“ match != None” 这次加入异常处理 #! ...

  6. Eclipse中Preference打开后找不到Server项解决方案。

    该解决方案是假设你已经安装好了JDK,tomcat,eclipse,突然在Eclipse的配置时找不到选择菜单栏中的window——preferences-server——runtime enviro ...

  7. 算法练习5---快速排序Java版

    基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成 ...

  8. 【scala】语法的省略

    我们直到JAVA在语法方面是冗长的,但是JAVA的可读性非常好. 在Scala的语法并不像JAVA那样冗长,但是又不失可读性,我们这里记录一下常见的语法省略. 首先是我们可以省略数据类型,因为Scal ...

  9. docker 部署一个 aspnetmvc 程序

    准备mvc的程序[asp.net mvc5 网站]  使用刚才创建的镜像,并把上诉文件目录挂载到iis指定磁盘docker run -d -p 83:80 --name docker-drgs -v  ...

  10. PostgreSQL full_page_write记录

    PostgreSQL 在 checkpoint 之后在对数据页面的第一次写的时候会将整个数据页面写到 xlog 里面. 当出现主机断电或者OS崩溃时,redo操作时通过checksum发现“部分写”的 ...