vc++ 之ADO数据库编程

ado数据库编程
  
  
 The Component Object Model组件对象模型
 ADO的三个核心对象:
    1、Connection对象:Connection对象表示了到数据库的连接,它管理应用程序和数据库之间的通信。Recordest和Command对象都有一个ActiveConnection属性,该属性用来饮用Connection对象。
    2、Command对象: Command对象被用来处理重复执行的查询,或处理需要检查在存储过程调用中的输出或返回参数的值的查询。
    3、Recordset对象: Recordset对象被用来获取数据。Recordset对象存放查询的结果,这些结果又数据的行(称为记录)和列(成为字段)组成。每一列都存放在Recordset的Fields集合中的一个Filed对象中  

      关于ADO数据库连接方面知识的总结   
    1、导入库文件   使用ADO前必须在工程的stdafx.h文件最后用直接引入符号#import引入ADO库文件,以使编译器能正确编译。代码如下: #import "C:\Program Files\common files\system\ado\msado15.dll" no_namespace rename("EOF","EndOfFile") rename("BOF","FirstOfFile")  
    ADO类的定义是作为一种资源存储在ADO DLL(msado15.dll)中,在其内部称为类型库。 类型库描述了自治接口,以及C++使用的COM vtable接口。 当使用#import指令时,在运行时Visual C++需要从ADO DLL中读取这个类型库, 并以此创建一组C++头文件。这些头文件具有.tli 和.tlh扩展名,#import引入ADO库文件的代码编译后,在项目的目录下生成了这两个文件。在C++程序代码中调用的ADO类要在这些文件中定义。
    程序的第三行指示ADO对象不使用名称空间,在有些应用程序中, 由于应用程序中的对象与ADO中的对象之间可能会出现命名冲突,所以有必要使用名称空间。 如果要使用名称空间,则可把第三行程序修改为: rename_namespace("AdoNS")。 第四行代码将ADO中的EOF(文件结束)更名为adoEOF,因为文件的结尾也是以EOF结尾的,是为了避免与定义了自己的EOF的其他库冲突。 至于改为什么名字,可以根据自己的命名习惯自己确定。    

    2、初始化COM环境 OLE DB 是基于COM技术编写的,ADO是OLE DB基础之上的用户程序, OLE DB是一个COM组件,在访问COM组件的时候需要初始化COM库,方法如下:
      (1)   ::CoInitialize(NULL); //初始化OLE/COM库环境 //对数据库的访问在上下代码之间写,下面第三步就应该写在这里 ::CoUninitialize();//既然初始化了环境,当然一定要记得释放他了
      (2)也可以调用MFC全局函数 AfxOleInit();  
    3、三大指针对象的定义和创建实例  
      (1)  _ConnectionPtr pConnection("ADODB.Connection");
           _RecordsetPtr pRecordset("ADODB.Recordset");
           _CommandPtr pCommand("ADODN.Command");
      (2)  _ConnectionPtr pConnection;
           _RecordsetPtr pRecordset;
           _CommandPtr pCommand;

           pConnection.CreateInstance(__uuidof(Connection));
           pRecordset.CreateInstance(__uuidof(Recordset));
           pCommand.CreateInstance(__uuidof(Command));

    要产生一个智能指针对象,其实在定义的同时也可以初始化,如:
    _ConnectionPtr pConnection(__uuidof(Connection));
    _ConnectionPtr 是智能指针 __uuidof() 用来获取Connection全局唯一标识符  

    (3) _ConnectionPtr pConnection;
        _RecordsetPtr pRecordset;
        _CommandPtr pCommand;

        pConnection.CreateInstance("ADODB.Connection");
        pRecordset.CreateInstance("ADODB.Recordset");
        pCommand.CreateInstance("ADODB.Command");

    4、打开一个连接
    pConnection- >ConnectionString = "这里的字符串有下面四种写法";//对连接字符串赋值
    pConnection- >Open(ConnectionString,"","",adModeUnknown); //连接数据库
    第二三个参数分别为用户的ID与密码, 因为在连接字符串ConnectionCstring中已经设置好了,这里可以为空。
    第四个参数可以取下面两个参数:
        adAsyncConnect  异步打开数据库,在ASP中直接用16
        adConnectUnspecified  同步打开数据库,在ASP中直接用-1


    ConnectionString根据不同的数据源,分别对应不同的写法
   (要记下来很困难,可以在VB中利用ADO控件先连接好,再将其拷贝在VC中,这样不容易出错)

     1) 访问Access 2000 "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=databaseName;User ID=userName;Password=userPassWord"
     2) 访问ODBC数据 "Provider=MADASQL;DSN=dsnName;UID=userName;PWD=userPassword;"
     3) 访问Oracle数据库 “Provider=MSDAORA;Data Sourse=serverName;User ID=userName;Password=userPassword;"
     4) 访问MS SQL数据库 "Provider=SQLOLEDB,Data Source=serverName;Initial Catalog=databaseName;User ID=userName;Password=userPassword;"

    5、执行SQL命令,得到数据
       方法1: pRecordset = pConnection- >Execute("Select * from authors",NULL,adCmdText);
       方法2: pRecordset - >Open("Select * from authors",_ variant_t((Idispacth*) pConnection), //设置活动连接 adOpenDynamtic, //游标类型 adLockOptimistic, //锁的类型 adCmdText);
       方法3: pCommand- >put_ActiveConnection(_variant_t((Idispatch *) pConn);
               pCommand- >CommandText = "Select * from authors";
               pRecordset = pCmd- >Execute(NULL,NULL,adCmdText);

     得到数据之后,做一个循环取得数据:
        While (!pRecordset - >adoEOF)
        {
            Str = pRecordset- >GetCollect("au_lname"));
            pRst- >MoveNext();
        }

     SQL命令比较多,但是不去考虑细节,这里只说出通用的方法
     CString strSQL;//定义SQL命令串,用来保存SQL语句
     strSQL.Format("SQL statement");

     然后在每个要用到SQL命令串的方法中,使用strSQL.AllocSysString()的方法进行类型转换

    6、com的专用数据类型
      variant ,bstr ,SafeArray
      variant变量的范围包括很多,它是一种变体类型,主要用于支持自动化的语言访问, 从而在VB中非常方便地使用,但是VC中比较复杂,它使用_variant_t 进行管理
      bstr是一种字符串变量,使用_bstr_t进行管理,这个类重载了char *操作符

    7、关闭连接
    if(pConnection- >State);     //不能多次关闭,否则会出现错误
        pConnection- >Close();
    pRecordset- >Close();
    pCommand.Release();
    pConnection.Release(); //释放引用计数
    pRecordset.Release();

    注意:调用Close()时用"- >",调用Release()时要用".",为什么?
    因为智能指针,_ConnectionPtr是一个重载了- >运算符的类
    _ConnectionPtr:它是一个接口指针模板。'.'是模板_com_ptr的函数。- >是'接口函数'调用。
    //forexample:
    _ConnectionPtr m_Conn;
    m_Conn.CreateInstance(....);//Createinterfaceinstance.
    m_Conn- >Open(...);//Openaconnectiontodatabase.

    '- >'是_com_ptr重载了的运算符.目的就是为了让你调用模板参数的函数.

    8、结构化异常处理 ADO封装了COM接口,所以需要进行错误处理
    如下例:
    HRESULT hr;
    try
    {
        hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
        if(SUCCEEDED(hr))
        {
            hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb","","",adModeUnknown);///连接数据库
            ///上面一句中连接字串中的Provider是针对ACCESS2000环境的,对于ACCESS97,需要改为:Provider=Microsoft.Jet.OLEDB.3.51;
        }
    }
    catch(_com_error e)///捕捉异常
    {
        CString errormessage; errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());         AfxMessageBox(errormessage);///显示错误信息
    }


    这里介绍了三种对象通过ADO访问数据库,它们都可以执行SQL语句获取数据,但不是管那种方法获取数据,最终都将数据放置到记录集对象当中。

 

                            本文转载自:孙鑫VC学习笔记:第二十讲 (二) ado数据库编程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值