ADO C++ Extensions
实际上,如果你是用C++进行应用程序开发的话,就应该使用ADO C++ Extensions。我们知道,在VB或者用VBScript来操作ADO的话,是非常方便的,但是如果使用C/C++或者是Java的话,就必须要处理类似VARIANTs这样的数据结构,实现和C++数据结构的转换,而这个无疑是所有C++开发人员都很头疼的事情。但如果你使用C++扩展的话,ADO不需要从数据提供者处得到列信息。ADO在设计时刻使用开发人员提供的列信息。以下是一个简单的示例:
file://创建和具体记录相对应的类
class CAuthor : public CADORecordBinding
{
BEGIN_ADO_BINDING(CCustomRs1)
ADO_VARIABLE_LENGTH_ENTRY4(1, adVarChar, m_szau_id, sizeof(m_szau_id), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(2,adVarChar,m_szau_fname,sizeof(m_szau_fname), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(3,adVarChar,m_szau_lname,sizeof(m_szau_lname), FALSE)
END_ADO_BINDING()
protected:
char m_szau_id[12];
char m_szau_fname[21];
char m_szau_lname[41];
};
void FetchAuthorData()
{
CAuthor author;
_RecordsetPtr pRs; file://记录集对象
IADORecordBinding *piAdoRecordBinding;
pRs.CreateInstance(__uuidof(Recordset)); file://获取COM对象接口指针
file://得到需要的记录集
pRs->Open("select au_id, au_fname, au_lname from Employees",
"Provider=SQLOLEDB;Data Source=sureshk1;Database=pubs;
User Id=sa;Password=;",
adOpenForwardOnly, adLockReadOnly, adCmdText);
file://查询接口IADORecordBinding
pRs->QueryInterface(__uuidof(IADORecordBinding),(LPVOID*)&piAdoRecordBinding);
file://和我们自己定义的对象相绑定
piAdoRecordBinding->BindToRecordset(&author);
while (VARIANT_FALSE == pRs->EOF) file://得到记录中的相关内容
{
printf("%s %s %s", author.m_szau_id, author.m_szau_fname, author.m_szau_lname);
pRs->MoveNext();
}
piAdoRecordBinding->Release(); file://释放对象
}
OLE DB消费者(Consumer)和提供者(Provider)模板
OLE DB是一个标准,它提供了一系列数据接口,通过这些接口我们可以操作各种不同的数据源,并能够进行无缝的集成,这些接口包含了到达数据和操作数据的工业标准。开发人员可以使用这些接口来定义非常简单的数据提供者,当然也可以提供非常复杂的象关系数据库这样的操作。它是建立在微软基于组件计算的策略上的。
因为OLE DB标准在各个层次定义了数据库操作的模式,使用OLE DB的组件可以对数据库进行非常复杂的操作,并且在多层应用系统开发领域大有作为。
建立在OLE DB基础上的三层组件系统说明:
数据提供者
实际上,OLD DB提供了一个数据提供者这个组件用来实现对所有不同的数据源(包括关系数据库、日志文件和非常复杂的格式比如IMS,ADABAS或者是电子邮件)的统一的操作,其结果表现形式为所有的信息都是以行集的形式返回给应用程序。数据提供者组件使数据源的厂商可以通过暴露行集的方法来实现接口。
数据消费者:
OLE DB数据消费者表示那些需要和数据源进行交互的系统或者应用,包括开发工具和个人产品工具等。
数据服务提供者
数据服务提供者目的是用来开发数据库组件,比如查询处理器或者是游标引擎,作为一个独立的产品能够无缝的和存在的基于OLE DB的数据提供者进行集成。
OLE DB数据提供者是以DLL形式存在的,所以在具体应用的时候,它就被装入应用程序所在的空间中,也就意味着OLE DB接口只能在进程范围内工作。数据提供者可以直接和数据源进行交互,也可以通过IPC进行交互。






