在VC++中利用ADO连接数据库(附带模块下载链接)

时间:2021-11-27 04:47:40

 一、首先我们学习一些预备知识

1、ADO是什么?

        微软公司的ADO (ActiveX Data Objects) 是一个用于存取数据源的COM组件。它提供了编程语言和统一数据访问方式OLE DB的一个中间层。允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,而只用关心到数据库的连接。访问数据库的时候,关于SQL的知识不是必要的,但是特定数据库支持的SQL命令仍可以通过ADO中的命令对象来执行。ADO被设计来继承微软早期的数据访问对象层,包括RDO (Remote Data Objects) 和DAO(Data Access Objects)。ADO在1996年冬被发布。

        ADO是一种面向对象的编程接口,微软介绍说,与其同IBM和Oracle提倡的那样,创建一个统一数据库,不如提供一个能够访问不同数据库的统一接口,这样会更加实用一些。为实现这一目标,微软在数据库和微软的OLE DB中提供了一种“桥”程序,这种程序能够提供对数据库的连接。 开发人员在使用ADO时,其实就是在使用OLE DB,不过OLE DB更加接近底层。ADO的一项属性??远程数据服务,支持“数据仓库”ActiveX 组件以及高效的客户端缓存。作为ActiveX的一部分,ADO也是COM组件的一部分。ADO是由早期的微软数据接口??远程数据对象RDO演化而来的。RDO同微软的ODBC一同连接关系数据库,不过不能连接非关系数据库。

2、Connection对象Recordset对象

      最重要的三个ADO对象是Connection, Recordset和Command. 本文将主要介绍Connection和Recordset这两个对象。每个Connection的属性定义了与数据源的连接。Recordset对象接收来自数据源的数据。Recordset可以与Connection一起起使用,先建立一个连接,然后获取数据。尽管如此,Recordset也可以被单独创建,其Connection参数可以在Open属性定义。

3、ADO连接ACCESS数据库

      ACCESS是一个关系型桌面数据库管理系统,它可以用来建立中小型号的数据库应用系统,使用非常广泛.下面介绍如何使用ADO连接ACCESS数据库.在连接数据库时,需要使用Connection对象的Open方法打开与数据源的连接.

      ADO(ActiveX Data Objects)是一种操作 Microsoft 所支持的数据库的新技术。ADO可以看成是一系列的对象,应用这些功能强大的对象,即可轻松完成对数据库复杂的操作。

      具体的操作步骤可以归纳为以下几步: 
  (1) 创建数据库源名(DSN)
  (2) 创建数据库链接(Connection)
  (3) 创建数据对象
  (4) 操作数据库
  (5) 关闭数据对象和链接

4、数据类型转换

      由于COM对象是跨平台的,它使用了一种通用的方法来处理各种类型的数据, 因此Cstring 类和COM对象是不兼容的,我们需要一组API来转换COM对象和C++类型的数据。_vatiant_t和_bstr_t就是这样两种对象。它们提供了通用的方法转换COM对象和C++类型的数据。

二、在VC中使用ADO的开发步骤:

1、引入ADO库文件

     ADO类的定义是作为一种资源存储在ADO DLL(msado15.dll)中,在其内部称为类型库。类型库描述了自治接口,以及C++使用的COM vtable接口。当使用#import指令时,在运行时Visual C++需要从ADO DLL中读取这个类型库,并以此创建一组C++头文件。这些头文件具有.tli 和.tlh扩展名,读者可以在项目的目录下找到这两个文件。在C++程序代码中调用的ADO类要在这些文件中定义。

       在你自己创建的类或者头文件的开头用#import引入ADO库文件。

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

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


2、初始化OLE/COM环境

       值得注意到的是,ADO库是一组COM动态库,这意味着应用程序在调用ADO之前,必须初始化OLE/COM库环境。在MFC应用程序里面,一个比较好用的方法就是在应用程序主类的InitInstance成员函数里面初始化OLE/COM库环境。但是通常我们都将ADO接口封装成一个类,在类函数里面初始化,代码如下:

  ::CoInitialize(NULL); //初始化OLE/COM库环境
  
  ::CoUninitialize();  //关闭OLE/COM库环境,释放资源
  
  AfxOleInit();//初始化OLE/COM库环境(MFC自带的)

3、使用ADO库的三个基本接口

      ADO库包含三个基本接口:_ConnectionPtr接口、_RecordsetPtr接口和_CommandPtr接口。
  
   其分别对应Connection对象(完成应用程序对数据源的访问连接)、Recordset对象(将查询的结果以记录集的方式存储)和Command对象(对已连接的数据源进行命令操作)。

      (1)定义对象并创建对象实例:

方法一:

  _ConnectionPtr m_pConnection;
  _RecordsetPtr m_pRecordset;
  _CommandPtr m_pCommand;
  m_pConnection.CreateInstance(__uuidof(Connection));
  m_pRecordset.CreateInstance(__uuidof(Recordset));
  m_pCommand.CreateInstance(__uuidof(Command));
方法二:
  _ConnectionPtr m_pConnection("ADODB.Connection");
  _RecordsetPtr m_pRecordset("ADODB.Recordset");
  _CommandPtr m_pCommand("ADODN.Command");
方法三:
  _ConnectionPtr m_pConnection;
  _RecordsetPtr m_pRecordset;
  _CommandPtr m_pCommand;
  m_pConnection.CreateInstance("ADODB.Connection");
  m_pRecordset.CreateInstance("ADODB.Recordset");
  m_pCommand.CreateInstance("ADODN.Command");
       这三种方法都是一样的,关键看你喜好。

       (2)举例:

        _ConnectionPtr接口: 

       主要用来连接数据库或者打开一个连接:

       pConnection->Open(ConnectionString,"","",adModeUnknown);///连接数据库

ConnectionString如下:

1)访问Access 2000 :"Provider=Microsoft.Jet.OLEDB.4.0;DataSource=databaseName;UserID=userName;Password=userPassWord"  

2)访问ODBC数据 :"Provider=MADASQL;DSN=dsnName;UID=userName;PWD=userPassword;"   

3)访问Oracle数据库:“Provider=MSDAORA;DataSourse=serverName;User ID=userName;Password=userPassword;"  

3)访问MS SQL数据库:"Provider=SQLOLEDB,Data Source=serverName;InitialCatalog=databaseName;User ID=userName;Password=userPassword;" 

4)访问ADO数据库: "UserID=;Password=;DRIVER={Microsoft Access Driver (*.mdb)};DBQ=shujuku.mdb;"


_ConnectionPtr m_pConnection;
m_pConnection.CreateInstance(__uuidof(Connection));
try
{
// 打开本地Access库shujuku.mdb
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=shujuku.mdb","","",adModeUnknown);
//SQL Server连接方法
_bstr_t strConnect ="Provider=SQLOLEDB; Server=billgates;Database=HrMan; uid=sa; pwd=sa;";//第一种
/*_bstr_t strConnect = "uid=;pwd=;DRIVER={Microsoft Access Driver (*.mdb)};DBQ=shujuku.mdb;";*///第二种
m_pConnection->Open(strConnect,"","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
}
         _RecordsetPtr接口:
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));//创建实例
CString sql;
sql.Format("SELECT * name FROM shujuku.mdb");//查询语句
try
{
m_pRecordset->Open(sql.GetBuffer(sql.GetLength()),_variant_t((IDispatch *)m_pConnection,true),adOpenDynamic,adLockOptimistic,adCmdText);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());//输出错误信息
}
CString strName;
while (!m_pRecordset->adoEOF)//读取数据
{
strName.Format("%s",(char*)(_bstr_t)m_pRecordset->GetCollect("姓名"));
m_listbox.AddString(strName);//把读出来的内容添加到列表框中
m_pRecordset->MoveNext();//移动记录集指针
}

           当然读取数据的方法还有_bstr_t  TheValue=m_pRecordset->Fields->GetItem("姓名")->Value;   

        _CommandPtr接口:(例子未经测试,以后再补上具体的说明)

  _CommandPtr m_pCommand;
  HRESULT hr = m_pCommand.CreateInstance(__uuidof(Command));
  if(FAILED(hr))
  {
  AfxMessageBox("创建Command对象实例失败!");
  }
  CString strP_mailid;
  _ParameterPtr param;
  param=m_pCommand->CreateParameter("p_mailid",adVarChar,adParamOutput,strP_mailid.GetLength()+1,_variant_t(strP_mailid));
  m_pCommand->Parameters->Append(param);
  
  m_pCommand->ActiveConnection = m_pConnection;
  m_pCommand->CommandType = adCmdStoredProc;
  m_pCommand->CommandText = _bstr_t("P_MAIL_SEND");
  try
{
  cmd->Execute(NULL,NULL,adCmdStoredProc);
  }
  catch (...)
{
  AfxMessageBox("调用存储过程P_MAIL_SEND有错!");
}
  try
{
  strP_mailid = (char*)(_bstr_t)m_pCommand->Parameters->GetItem(_variant_t("p_mailid"))->GetValue();
}
catch (...)
{
strP_mailid = "";
}
  m_pCommand.Detach();


三、模块化----VC中使用ADO的开发步骤(名字空间)

        在你的项目文件中新建一个generic class 类,名字自取;

        在该类当中添加ADO的三种类型的指针;

        在该类当中添加6个函数,他们分别是:1)连接函数:主要完成COM接口的初始化和数据库的连接2)获取记录集函数:主要完成根据SQL语句来获取指向数据库当中的数据的记录集指针3)执行SQL语句函数4)断开数据库连接。

         该模块下载地址:http://download.csdn.net/detail/csf111/3667364   欢迎下载交流。

在VC++中利用ADO连接数据库(附带模块下载链接)