• VC++ ADO开发实践access,sql


    一、ADO概述

    ADO是Microsoft为最新和最强大的数据访问范例 OLE DB 而设计的,是一个便于使用的应用程序层接口。ADO 使您能够编写应用程序以通过 OLE.DB 提供者访问和操作数据库服务器中的数据。ADO 最主要的优点是易于使用、速度快、内存支出少和磁盘遗迹小。ADO 在关键的应用方案中使用最少的网络流量,并且在前端和数据源之间使用最少的层数,所有这些都是为了提供轻量、高性能的接口。之所以称为 ADO,是用了一个比较熟悉的暗喻,OLE 自动化接口。

    OLE DB是一组”组件对象模型”(COM) 接口,是新的数据库低层接口,它封装了ODBC的功能,并以统一的方式访问存储在不同信息源中的数据。OLE DB是Microsoft UDA(Universal Data Access)策略的技术基础。OLE DB 为任何数据源提供了高性能的访问,这些数据源包括关系和非关系数据库、电子邮件和文件系统、文本和图形、自定义业务对象等等。也就是说,OLE DB 并不局限于 ISAM、Jet 甚至关系数据源,它能够处理任何类型的数据,而不考虑它们的格式和存储方法。在实际应用中,这种多样性意味着可以访问驻留在 Excel 电子数据表、文本文件、电子邮件/目录服务甚至邮件服务器,诸如 Microsoft Exchange 中的数据。但是,OLE DB 应用程序编程接口的目的是为各种应用程序提供最佳的功能,它并不符合简单化的要求。您需要的API 应该是一座连接应用程序和 OLE DB 的桥梁,这就是 ActiveX Data Objects (ADO)。

    二、在VC中使用ADO

    1、引入ADO库文件

    使用ADO前必须在工程的stdafx.h文件里用直接引入符号#import引入ADO库文件,以使编译器能正确编译。代码如下所示:

    代码1:用#import引入ADO库文件

    #import "c:\program files\common files\system\ado\msado15.dll"

    no_namespaces rename("EOF" adoEOF")

    这行语句声明在工程中使用ADO,但不使用ADO的名字空间,并且为了避免常数冲突,将常数EOF改名为adoEOF。现在不需添加另外的头文件,就可以使用ADO接口了。

    2、初始化OLE/COM库环境

    必须注意的是,ADO库是一组COM动态库,这意味应用程序在调用ADO前,必须初始化OLE/COM库环境。在MFC应用程序里,一个比较好的方法是在应用程序主类的InitInstance成员函数里初始化OLE/COM库环境。

     

    代码2:初始化OLE/COM库环境

    BOOL CADOApp::InitInstance()

    {

    if(!AfxOleInit())

     

    {

    AfxMessageBox(“OLE初始化出错!”);

    return FALSE;

    }

    ……

     

    }

    函数AfxOleInit在每次应用程序启动时初始化OLE/COM库环境。

    同DAO和CDatabase一样,ADO由几个接口组成:

    _ConnectionPtr,_CommandPtr和_RecordsetPtr.

    不同于DAO和Cdatabase的是,ADO基于COM的接口,因此,假如你没有接触过COM,你应该在使用ADO前先找有关书籍了解一下COM。

    3、ADO接口简介

    ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。

    _ConnectionPtr接口返回一个记录集或一个空指针。通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。使用_ConnectionPtr接口返回一个记录集不是一个好的使用方法。通常同CDatabase一样,使用它创建一个数据连接,然后使用其它对象执行数据输入输出操作。

    _CommandPtr接口返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,你可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。如果你只执行一次或几次数据访问操作,后者是比较好的选择。但如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用_CommandPtr接口执行存储过程和SQL语句。

    _RecordsetPtr是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给_RecordsetPtr的connection成员变量,让它自己创建数据连接。如果你要使用多个记录集,最好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口,然后使用_RecordsetPtr执行存储过程和SQL语句。

     

    4、使用_ConnectionPtr接口

    _ConnectionPtr是一个连接接口,它类似于CDatabase和CDaoDatabase。它们的工作原理相似。首先创建一个_ConnectionPtr接口实例,接着指向并打开一个ODBC数据源或OLE DB数据提供者(Provider)。以下代码和CDaoDatabase分别创建一个基于DSN和非DSN的数据连接。

     

    代码3:使用CDaoDatabase(基于DSN)

    CDaoDatabase MyDb = new CDaoDatabase();

    MyDb.Open(NULL,FALSE,FALSE,"ODBC;DSN=samp;UID=admin;PWD=admin");

     

     

    代码4:使用CDaoDatabase(基于非DSN)

    CDaoDatabase MyDb = new CDaoDatabase();

    MyDb.Open(NULL,FALSE,FALSE,"ODBC;DRIVER={SQL Server};SERVER=server;

    DATABASE=samp;UID=admin;PWD=admin");

     

     

    代码5:使用_ConnectionPtr(基于DSN)

    _ConnectionPtr MyDb;

    MyDb.CreateInstance(__uuidof(Connection));

    MyDb->Open("DSN=samp;UID=admin;PWD=admin","","",-1);

     

     

    代码6:使用_ConnectionPtr (基于非DSN)

    _ConnectionPtr MyDb;

    MyDb.CreateInstance(__uuidof(Connection));

    MyDb->Open("Provider=SQLOLEDB;SERVER=server;DATABASE=samp;UID=admin;

    PWD=admin","","",-1);

     

    5、使用_RecordsetPtr接口

    _RecordsetPtr接口的使用方法和CDaoDatabase类似,通过以下代码的比较,你会发现使用_RecordsetPtr接口非常简单(以下代码使用上面已经创建的数据连接):

     

    代码7:使用CDaoDatabase执行SQL语句

    CDaoRecordset MySet = new CDaoRecordset(MyDb);

    MySet->Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT * FROM t_samp");

    Now using ADO:

     

     

    代码8:使用_RecordsetPtr执行SQL语句

    _RecordsetPtr MySet;

    MySet.CreateInstance(__uuidof(Recordset));

    MySet->Open("SELECT * FROM some_table",

    MyDb.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

    现在我们已经有了一个数据连接和一个记录集,接下来就可以使用数据了。从以下代码可以看到,使用ADO的_RecordsetPtr接口,就不需要象DAO那样频繁地使用大而复杂的数据结构VARIANT,并强制转换各种数据类型了,这也是ADO的优点之一。假定程序有一个名称为m_List的的ListBox控件,下面代码我们用_RecordsetPtr接口获取记录集数据并填充这个ListBox控件:

     

    代码9:使用DAO访问数据

    VARIANT * vFieldValue;

    COleVariant covFieldValue;

    CString Holder;

    while(!MySet->IsEOF())

    {

    MySet->GetFieldValue("FIELD_1", covFieldValue);

    vFieldValue = (LPVARIANT)covFieldValue;

    if(vFieldValue->vt!-VT_NULL)

    {

    Holder.Format("%s",vFieldValue->pbVal);

    m_List.AddString(Holder);

     

    }

    MySet.MoveNext();

     

    }

  • 相关阅读:
    属性序列化自定义与字母表排序-JSON框架Jackson精解第3篇
    URL及日期等特殊数据格式处理-JSON框架Jackson精解第2篇
    JSON数据处理框架Jackson精解第一篇-序列化与反序列化核心用法
    开源项目-跨项目及操作系统的通用代码生成器,解放您的双手
    图解并发与并行-分别从CPU和线程的角度理解
    8成以上的java线程状态图都画错了,看看这个-图解java并发第二篇
    面霸告诉你这些技术面试的非技术性经验,让你的面试成功率显著提升
    List集合对象去重及按属性去重的8种方法-java基础总结系列第六篇
    图解进程线程、互斥锁与信号量-看完不懂你来打我
    总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇
  • 原文地址:https://www.cnblogs.com/shengshuai/p/c_ado.html
Copyright © 2020-2023  润新知