2)ADO对象模型组成 与微软的其它数据访问模型DAO和RDO相比,ADO对象模型非常精炼,仅由三个主要对象Connection、Command、Recordset和几个辅助对象组成。Connection对象提供OLE DB数据源和对话对象之间的关联,它通过用户名称和口令来处理用户身份的鉴别,并提供事务处理的支持;它还提供执行方法,从而简化数据源的连接和数据检索的进程。Command对象封装了数据源可以解释的命令,该命令可以是SQL命令、存储过程或底层数据源可以理解的任何内容。Record set用于表示从数据源中返回的表格数据,它封装了记录集合的导航、记录更新、记录删除和新记录的添加等方法,还提供了批量更新记录的能力。其它辅助对象则分别提供封装ADO错误、封装命令参数和封装记录集合的列。 3)ADO的特点分析 (a)由于封装了许多底层工作,使用ADO与使用ODBC几乎是一样方便。 (b) ADO不仅具有ODBC的主要功能,而且ADO适用的数据源的范围要大的多。 (c)在定义ADO记录集变量和数据库表字段绑定类时,要求记录集的字段变量、状态变量与数据库表字段的个数、顺序必须相同。这一点比在FMC中使用ODBC要复杂一些。但在数据库字段与ADO记录集字段变量绑定的宏中,ADO 提供的数据类型要远多于FMC中的RFX(如日期时间类型,在ODBC中只能转换为Cstring类型)。 (d)ADO允许同一Connection实例下有多个Record set实例。 (e)ADO允许进行批更新(使用的Update Batch方法),这样将大大减轻网络负担,提高数据库处理效率。 4) ADO在Visual C++中的使用 利用微软在Micrsoft Studio 6中提供的ADO2,可以在Visual C++中使用ADO接口操纵SQL SERVER数据库。在编译型高级语言中使用ADO,比起在一些脚本语言(如Visual Basic Scropt和JavaScript)中使用ADO要困难一些。 以下给出一个Visual C++下使用ADO的Connection对象及其Record set对象的基本步骤: (a) 使用import指令引入ADO2组件 例:#import "C:\ADO\msado15.dll " no_namespace rename( "EOF ", "EndOfFile ") (b) 定义CADORecordBinding 的派生类,用于程序与数据库表字段的交互,该类的定义可参见icrsint.h。 例: class CIntlive : public CADORecordBinding { public: DBTIMESTAMP m_datetime; //定义ADO记录集字段变量(与数据库表字段相对应) long m_key; long m_value; long m_quality; WORD m_stsdatetime; //定义ADO记录集状态变量 WORD m_stskey; WORD m_stsvalue; WORD m_stsquality; BEGIN_ADO_BINDING(CIntlive) //将数据库字段与ADO记录集字段变量绑定 ADO_VARIABLE_LENGTH_ENTRY2(1,adDBTimeStamp,m_datetime,sizeof(m_datetime),m_stsdatetime,true) ADO_NUMERIC_ENTRY(2,adInteger,m_key,10,0,m_stskey,true) ADO_NUMERIC_ENTRY(3,adInteger,m_value,10,0,m_stsvalue,true) ADO_NUMERIC_ENTRY(4,adInteger,m_quality,10,0,m_stsquality,true) END_ADO_BINDING() }; (c) 调用CoInitialize初始化COM ::CoInitialize(NULL); (d) 声明ADO的Connection对象指针和Recordset对象指针并初始化。(类型名在 msado15.dll中已定义) 例: _ConnectionPtr pConnection1 = NULL; _RecordsetPtr rstADO1 = NULL; (e) 定义CADORecordBinding派生类的实例及其Bind接口指针。 例: CIntlive m_intdata; IADORecordBinding *rstADOBind1 = NULL; (f) 产生Connection对象实例和Record set对象实例。 例: pConnection1.CreateInstance(_uuidof(Connection)); rstADO1.CreateInstance(__uuidof(Recordset)) ; (g) 连接到数据库并打开Record set对象,其中open函数的参数的使用方法可参见微软MSDN中ADO 相应对象参数的Basic描述。 例: PConnection1-> Open( "driver={SQL server};server=servera;uid=sa;pwd=;database=pubs ", " ", " ",NULL); rstADO1-> Open( "data ", _variant_t((IDispatch *)pConnection1,true), adOpenKeyset,adLockBatchOptimistic, adCmdTable); (h) 将CADORecordBinding派生类的实例联编到Record set对象的Bind接口。 例: RstADOBind1-> BindToRecordset(&m_intdata); (i) 对Record set对象实例进行操作。操作方法可参见微软MSDN中ADO Record set对象相应方法的Basic描述。 例: rstADO1-> Move Next(); //移动游标到下一条记录 rstADO1-> Update(_variant_t( "quality "),_variant_t( "3 "))); //修改记录的quality字段的值为3 rstADO1-> Update Batch(adAffectAll)); //将在Record set对象上的所有更新一次送入数据库 (j) 关闭Record set对象并释放Bind接口。 例: RstADO1-> Close(); RstADOBind2-> Release(); (k) 关闭连接 pConnection1-> Close(); (l) 调用CoUnitialize释放COM资源 ::CoUninitialize(); 5) 结论 作为ODBC的替代产品,ADO确实有其过人之处。由于ADO数据源几乎覆盖了目前常见的数据源类型,对于ODBC所不支持的数据源,ADO无疑是唯一的选择。而ADO的批更新功能,更是网络环境下大数据量更新应用的重要因素。由于ADO缺乏大量的第三方厂商的支持,使得ADO目前远不如ODBC普及,但其面向对象的特性将使ADO具有比较广阔的发展前景。
|