下载第 18章 对 C++组件的进一步讨论在前一章中,我们学习了用 C + +创建 C O M组件的基本方法,用这些概念创建的组件对于在内存中处理数据是非常有用的。但是,要制作一个功能强大的服务器组件,需要使用微软平台提供的其他服务。特别是,创建的组件应能提供对数据的访问、与 C O M +进行接口以及与 A S P交互的功能。本章主要内容有以下几个方面:
使用 A S P内置接口。
与 C O M +进行接口。
通过 C + +使用 A D O。
使用 OLE DB消费者模板。
18.1 与 A S P进行接口前一章创建的组件没有考虑到在 A S P中的使用,如果想创建在任何环境中使用的一般组件这是有效的。然而,如果 A S P页能访问信息,组件也能访问的话,这个组件在 We b应用程序中将会十分有用。如果能够完成像 A S P页一样的基于 We b的交互功能,则这个组件将更有用。
C O M的世界十分精彩,可用 C + +组件做任何事情。就像在 A S P中可以有各种各样可用的对象一样,可从服务器对象访问这些组件。在 A S P中所做的工作大部分可通过下列内置对象实现:
R e q u e s t,R e s p o n s e,S e s s i o n,A p p l i c a t i o n和 S e r v e r。指向任一对象的指针可通过 S c r i p t i n g C o n t e x t
获得。因此,关键是得到指向 S c r i p t i n g C o n t e x t的指针,然后寻找相应的内置对象。
与多数编程工作不同,程序的代码是由 Visual C++ AppWi z a r d产生的。我们要使第 1 7章中创建的组件“启用 A S P”,这时将有两个选择:一种是在本章中创建组件,拷贝并粘贴合适的代码到前面的组件中;另一种从一个新的组件开始,并加入在前一章中编写的代码。我们选择后者。
使用不同的向导选项创建组件的框架,然后通过 Wi n d i ff观察附加代码的生成,
这将有助于理解。 Wi n d i ff是 Visual C++附带的程序。
使用在上一章创建 A S P C o m p o n e n t s
Visual C++项目,插入一个新的 AT L对象。
创建一个 ActiveX Server组件而不是创建
Simple Object,命名为 C Ta b l e S t o r a g e 2,如图 1 8 - 1所示。
Simple Object向导与 ActiveX Server向导的不同在于后者包含 A S P属性页。在 A S P
属性页中,仅选择 R e s p o n s e复选框。在我们的例子中,仅使用 R e s p o n s e对象,但是如果需要再添加其他内置对象也非常容易,
如图 1 8 - 2所示。
图 18-1 创建 ActiveX Server组件图 18-2 选择 A S P内置对象这表现了 Visual C + +的灵活性和高效性,仅选择所需要的特性,可减少组件的代码。当然,与在 A S P中不同,特性不仅仅是编程环境的一部分,增加特性就要增加代码。
不选择 O n S t a r t P a g e / O n E n d P a g e时,所有内置对象均无效。必须调用 O n S t a r t P a g e才能得到内置对象。如果选择内置对象,将会自动产生 O n S t a r t P a g e和 O n E n d P a g e。这种相关性必须引起开发人员的注意。
我们来看一下选用 ActiveX Server组件后产生的代码,如果已有一个启用 A S P的组件,必须人工插入这段代码。
首先,文件 Ta b l e S t o r a g e 2,h中有一个新的头文件,它包含使用 S c r i p t i n g C o n t e x t和 A S P内置对象所需的常数和定义。
注意,这里使用 S c r i p t i n g C o n t e x t而不是使用较新的 O b j e c t C o n t e x t,AT L向导产生使用 S c r i p t i n g C o n t e x t的代码,一般情况下不必进行修改。
你将看到增加了 O n S t a r t P a g e和 O n E n d P a g e方法。有了这两个方法,就可以在 A S P页面创建这个组件时,或在 A S P页面用过它之后做一些工作。这些方法将在以后讨论。
在类里面增加了一些成员变量。其中一个是 R e s p o n s e对象的指针。如果选择其他的 A S P内置对象,也要为它们声明指针。指向对象的指针声明后,这个指针实际上还没有指向这个对象。
另一个成员变量是一个布尔变量,表示调用 O n S t a r t P a g e是否成功,后面你将看到其重要性。在构造器中这个变量被初始化为 FA L S E (在对象首次被创建时,会调用构造器 )。在 C + +中构造器和析构器起的作用分别与 V B中的 C l a s s _ I n i t i a l i z e和 C l a s s _ Te r m i n a t e方法相同。
第 1 8章 对 C + +组件的进一步讨论 计计 539下载这是头文件的全部变化。我们再来看一下 A p p Wi z a r d为 Ta b l e S t o r a g e 2,c p p生成的代码。这个 代码 实现 了 O n S t a r t P a g e 和 O n E n d P a g e 方 法。 如果 转换 上一 章中 的组 件,在
A S P C o m p o n e n t s,c p p中必须有一行是 #include Ta b l e S t o r a g e 2,h。
O n S t a r t P a g e的主要任务是得到 S c r i p t i n g C o n t e x t和指向 A S P内置对象的指针。在这个例子中只有得到 R e s p o n s e对象的代码。再强调一次,如果选择了其他的 A S P内置对象,就得到指向它们的指针。一旦成功获取了指向 A S P内置对象的指针,m _ b O n S t a r t P a g e C a l l e d将置为
T R U E。可用这个变量对使用 A S P内置对象是否安全进行检查:
A S P页处理完后,调用 O n E n d P a g e方法,这时 A S P内置对象的指针没有意义,因此释放接口,并且 m _ b O n S t a r t P a g e C a l l e d置为 FA L S E:
如果在 A S P页中对象有效期的开头和结尾处要进行一些处理的话,可在 O n S t a r t P a g e和
O n E n d P a g e内编写程序。
简单的组件与 ActiveX Server组件不同。 O n S t a r t P a g e和 O n E n d P a g e方法通过 A c t i v e X自动化提供,所以在组件的外部可以调用。要这样做必须在接口定义语言 ( I D L )文件中对此进行说明。在 A S P C o m p o n e n t s,i d l中有这两条语句:
540计计 ASP 3 高级编程 下载第 1 8章 对 C + +组件的进一步讨论 计计 541
编译组件时,M I D L编译器使用 I D L文件创建一个类型库和调度代码。
现在已经可以在组件中使用 R e s p o n s e对象了。先添加一个方法来使用它。在前一章中我们编写了一个 A S P程序,它用存储在组件中的数据生成 H T M L。如果由组件本身产生 H T M L表,
组件会更强大。这一修改使得性能更为优越,并封装了绘制逻辑。
封装具有许多好处。对于生成表,所有绘制代码集中到一个地方,任何 A S P页可调用包含这段代码的组件,并可以运行它。很显然这比在页和页之间拷贝同样的代码或编写新的代码简单。开发人员可主要关心将像数据存取这样的高层次问题,而不是去寻找遍历数据并在表中显示的方式。调用一个组件和运行预编译代码比分析一系列复杂的 H T M L命令快得多。
最后需要说明的是即使绘制编码需要有微小的修改,组件也要重新编译。开发组件时应仔细考虑程序员在生成表时需要设置的参数。用户可修改的特征,如边界尺寸、表格单元的背景色,可作为参数传给接口方法,而不必进行硬编码。但是如果组件接口改变,使用这个接口的 A S P页必须进行修改。
还 有 一 点 需 要 说 明,必 须 在
I Ta b l e S t o r a g e 2中增加与 I Ta b l e S t o r a g e相同的方法,例 如 P a r s e C S V,G e t F i e l d 和
G e t C o l u m n N a m e等。详细内容可参阅第 1 7章。
在 I Ta b l e S t o r a g e 2中增加一个新方法
O u t p u t Ta b l e,按照图 1 8 - 3所示的对话框进行配置。
虽然增加其他表格属性如颜色、单元宽度等也很简单,但为了说明方便,仅允许改变边界尺寸。 O u t p u t Ta b l e的代码如下:
首先确认 m _ b O n S t a r t P a g e C a l l e d为 T R U E并且,m _ p i R e s p o n s e确实包含一个指针。如果检查通过,就可以使用 R e s p o n s e对象。
Wr i t e方法希望字符串为 v a r i a n t,在 C + +中使用 v a r i a n t必须指定一种 v a r i a n t类型。最简单的方法是将字符串作为字符类型,并用 C C o m Va r i a n t类构造一个 v a r i a n t。下一步输出表列:
图 18-3 增加新方法下载列的名称作为键存储在列映射中,因此,可以遍历列映射得到列的名称,并显示在表格的表头中。像前面一样,将字符串转换为 v a r i a n t,与 R e s p o n s e对象一起送到浏览器中,一旦列输出完成,接下来处理行:
每一行是 v e c t o r数据结构中的一个元素,因此可遍历 m _ r o w。列的数据与列的标题对应。
上一章讲过行数据使用映射可使存储空间最小。因此,可遍历列名称以判定特定行是否有值,
如果其值存在,则输出,否则,输出一个空的表格单元。
最后关闭 H T M L标记并递增遍历器:
使用此组件的 A S P代码类似于:
542计计 ASP 3 高级编程 下载这与上一章中的 A S P代码非常相似,区别只是没有遍历字段以显示数据,仅须调用
O u t p u t Ta b l e。这段代码比较简洁并可得到相似的结果,如图 1 8 - 4所示。
图 18-4 浏览器中显示的表此表仅是相似,列的顺序不同。这是因为 C + +程序与 A S P代码用不同的方式进行列遍历,
C + +中列按字母顺序存储在 m a p数据结构中。另一方面,A S P代码以列存储的顺序进行遍历,
其存储的顺序是,N a m e,G r o u p,I n s t r u m e n t”,是由上一章的例子生成的输出。可以扩展
O u t p u t Ta b l e方法,使用户可指定列的顺序,而不需要改变代码。
综上所述,如果可以与其环境交互,C + +服务器组件会更有用。在这种情况下,C + +组件可通过 C O M得到各种 A S P内置对象的指针。这样可以让组件利用 ASP 的固有功能。我们仅分析了一个 A S P内置对象,其余的都以同样的方式工作。下面介绍 C + +服务器组件如何通过
C O M +与其环境交互。
18.2 与 C O M +进行接口特别应当注意,Visual C++向导仍采用术语,M T S”,Visual C++头文件和静态库名称中仍含有,m t x” 。因此,本节中我们使用术语,M T S / C O M +”,而不只是,C O M +” 。
第 1 8章 对 C + +组件的进一步讨论 计计 543下载
Visual C++在两个方面提供 M T S / C O M +支持:一是在创建项目时,二是在项目中使用指定的组件时。
首先来看一下 M T S / C O M +对于项目的支持。当编译和链接项目时,便转换为 D L L或 E X E。
在项目中使用 M T S / C O M +服务时,必须链接指定的库。 Visual C++ AppWi z a r d可帮助完成此项任务。
在你第一次创建项目时,可能已注意到了 Support MTS复选框,如图 1 8 - 5所示。
图 18-5 Visual C++ AppWi z a r d
如果选定此复选框,不会产生附加代码,但向导改变项目设置使其“启用 C O M+” 。特别是,向链接线增加了 m t x,l i b,m t x g u i d,l i b和 d e l a y i m p,l i b库。因此,如果没有对上述复选框进行选定,仍可通过如图 1 8 - 6所示的方式在链接线中添加这些文件名,使现有的组件“启用
C O M +” 。
图 18-6 添加库另一个选择是创建启用 C O M +的组件。当在项目上添加一个新的 AT L组件时,选择 M S
Transaction Server Component,如图 1 8 - 7所示。
544计计 ASP 3 高级编程 下载图 18-7 在项目中增加新的 ATL 组件单击属性页将出现图 1 8 - 8所示的内容。
图 18-8 ATL Object Wizard Properties对话框创建 M T S / C O M +对象时,向导将在项目中添加代码,下面看一下这种配置产生的附加代码。
在新组件的头文件中,你可看到增加了一个包含文件:
和用于 A S P内置对象的包含文件类似,此文件包含在 C + +组件中使用 M T S / C O M +组件所需的常数和定义。组件中头文件还有一处改变:
M T S / C O M +对象不能作为其他对象集合体的一部分使用。因此,必须插入代码防止这种情况发生。
如果不使用 A p p Wi z a r d创建组件,使组件“启用 C O M +”是非常容易的。如果选择
I O b j e c t C o n t r o l支持,应该在项目中插入下列附加代码。组件的头文件中也有些改变。
首先,组件继承 I O b j e c t C o n t r o l接口,因此它必须实现该接口定义的方法:
第 1 8章 对 C + +组件的进一步讨论 计计 545下载确保向导声明了 I O b j e c t C o n t r o l的方法和 O b j e c t C o n t e x t的指针。
向导在源文件中实现这些方法。当第一次使用对象时调用 A c t i v a t e方法,并自动生成
O b j e c t C o n t e x t的指针。
如果选择 I O b j e c t C o n t r o l支持,而没有缓冲对象,C a n B e P o o l e d方法将返回 FA L S E:
后面将详细讨论对象缓冲问题。最后,当对象不再使用时,将释放对 I O b j e c t C o n t e x t的引用。
对于服务器组件,有许多 M T S / C O M +接口可用。下面以 I O b j e c t C o n t e x t接口为例进行讨论。
18.2.1 IObjectContext的事务处理每个 M T S / C O M +对象均有相应的环境。环境隐含着与对象相关的状态,包含对象的执行环境信息和参与的事务的信息。
I O b j e c t C o n t e x t可完成下列功能:
声明工作完成。
不允许提交暂时的或永久的事务。
在当前事务范围内开始新的 M T S / C O M +对象。
检查调用者的角色。
检查安全性。
检查事务状态。
在前一节中,组件已经有一个对 I O b j e c t C o n t e x t接口的引用。我们将实现 C l e a r方法,从组件中删除所有数据。对 I Ta b l e S t o r a g e 2接口添加一个不带任何参数的 C l e a r ( )方法,用下列代码填写此方法的主体中:
546计计 ASP 3 高级编程 下载这个方法的目的是删除组件中的所有数据。必须检查 O b j e c t C o n t e x t的引用是否确实存在。
如果在 C O M +以外使用组件,这个指针的值不存在,进行引用会引起组件崩溃。在这个例子中,调用 S e t C o m p l e t e方法告诉 C O M +“不再保持状态,可以释放。,
18.2.2 IObjectControl的对象缓冲
I O b j e c t C o n t r o l接口用于对象缓冲,可增强应用程序的性能。当超出对象的使用范围时,
被缓冲的对象不会真的破坏,只是处于无效状态。当请求这种类型的对象时,可以重新使用这个对象,组件被循环使用。性能增强的原因是当一个对象无效时,对象没有完全损坏,因此就不需执行很多工作。同样,激活一个无效对象也不需执行很多工作。
在创建 M T S / C O M +对象时,对象缓冲可通过 ATL Object Wizard Properties对话框启用,
如图 1 8 - 9所示。
图 18-9 启用对象缓冲注意 Can be pooled选项只能在选定 Support IObjectControl后才能选定。另一种方式是将
C a n B e P o o l e d方法中的返回值改为 T U R E:
使用对象缓冲所需做的工作仅此而已。
上面讲述了组件如何与 A S P和 C O M +相互作用,下面我们讲述组件如何访问永久性数据。
18.3 数据访问服务器组件一般用于实现三层应用程序的业务规则,因此需要与数据库交互。 C + +访问数第 1 8章 对 C + +组件的进一步讨论 计计 547下载据有两种方式,A D O和 OLE DB消费者模板。第 1 2章我们已经讨论了通用数据访问 ( U D A )、
A D O和 OLE DB的作用。
从 C + + A D O与从 A S P或 Visual Basic访问 A D O非常相似。使用完全一样的 ADO COM对象
` (如 A D O D B,R e c o r d s e t ),只是用不同的语言创建和使用 ADO COM对象。但使用 A D O时没有
Visual C++向导,必须编写所有的实现代码。这不仅须手工编写,而且还容易引入代码错误,
因此应认真仔细。但是可从 C + +中得到完全可用的 A D O对象模型。
OLE DB消费者使用 OLE DB提供者的服务访问数据。 A D O是 OLE DB消费者的一个例子。
使用 C + +可创建 OLE DB消费者,完全跳过 A D O层。 Visual C++向导可用于创建和使用 O L E
D B消费者。可以使用向导指向想要访问的数据库和表格,自动生成所需的代码。但是,因为消费者代码直接指向指定的数据库,所以不如使用 A D O灵活。
18.3.1 通过 C + +使用 A D O
通过 C + +使用 A D O需要两种技能:理解 A D O对象模型和在 C + +中使用 C O M对象。我们对
A D O对象模型已非常熟悉,但现在没有 C + +类库或模板库支持 A D O。因为 A D O在 C O M上构造,
使用 A D O与使用其他 C O M对象相同。下面介绍一下使用步骤。
1,设置使用 A D O
C + +中使用 C O M组件最简单的方法是用 # import关键字导入组件的类型库。 # import 指令围绕 A D O类型库产生瘦 C + +类,可以用接近于 V B S c r i p t和 Visual Basic的语句操作 A D O对象和接口。大部分 A D O例子用 V B S c r i p t编写,用 # import指令能很容易地将它们转换为 C + +,比在没有包装类 (wrapper class)的情况下使用 A D O容易。
使用 # i m p o r t时,可以使用 n o _ n a m e s p a c e属性,这样 A D O类型库内容就没有范围限制。但是,这会引起名称与 E O F的冲突,而 r e n a m e属性可解决这个问题。在 Ta b l e S t o r a g e 2,c p p增加下列内容可导入 A D O类型库。
上述代码生成一个 m s a d o 1 5,t l h文件和一个 m s a d o 1 5,t l i文件。 m s a d o 1 5,t l h文件包含前向引用,s m a r t指针声明和 t y p e i n f o声明。 m s a d o 1 5,t l i文件包含编译器产生的几个成员函数的实现。
这两个文件用于观察和显示类型库中的可用内容。例如,下面是 m s a d o 1 5,t l h文件对 A D O记录集的 s m a r t指针的声明:
后面的例子将说明如何在代码中使用 s m a r t指针。在 m s a d o 1 5,t l h中还有一些枚举量的声明,
使得使用 A D O更为方便。下面是光标位置的枚举量声明:
548计计 ASP 3 高级编程 下载如上所述,# i m p o r t使得 A D O的使用更为轻松,因为这个指令可自动创建包装类和来自类型库的类型信息。但对 C + +程序员来说,将 A D O返回的 VA R I A N T数据类型转变为 C / C + +数据类型还是比较麻烦。 ADO 2.0和 Visual C++ 6.0用附加的 ADO VC++扩展解决了这个问题。这一章不讨论 ADO VC++扩展,有关内容可参考 Visual C++文献。
还增加了一个宏,这个宏可使程序容易理解,减少了嵌套代码的数量:
通过导入类型库,已可使用所有 A D O对象。
下面介绍如何在 C + +中使用 A D O进行读写。我们将以图 1 8 - 1 0所示的数据库为例。
假设对这个数据库已建立了一个称为 M u s i c i a n
D S N的 O D B C连接。
2,读数据库首先在 I Ta b l e S t o r a g e 2中增加 R e a d方法。这个方法从数据库读记录,并将这些记录插入 S T L
数据结构中,它的参数是 D S N名称、用户名和口令。在对话框中,参数在 I m p l e m e n t a t i o n文本框中出现,如图 1 8 - 11所示。
图 1 8 - 11 Implementation文本框下面看一下这个方法的实现:
首先声明方法中使用的变量,注意如何使用 ATL smart指针的创建 ADO Connection和
R e c o r d s e t对象。为在代码中跟踪错误,我们采用了异常处理,因此开启一个 t r y块。任何 A D O
第 1 8章 对 C + +组件的进一步讨论 计计 549下载图 18-10 示例所用的数据库调用都用前面声明的 S A F E _ C A L L宏包装,如果任一方法调用返回一个表明失败的值,就抛出一个异常:
首先打开到数据库的连接,这个连接用于 R e c o r d s e t对象的 O p e n方法。
如果成功,可对数据库的记录进行遍历。首先必须确保内存中当前无数据:
然后在 S T L数据结构中设置列名称:
现在,将数据库中的数据拷贝到内存中的 S T L数据结构内,遍历记录直到遇到文件结束标志 E O F。只在字段真的有值时才插入它,这样可以节约内存:
550计计 ASP 3 高级编程 下载到目前为止,所有一切都在 t r y 块中。如果有错误出现,程序流将进入 c a t c h块。
_ c o m _ e r r o r变量包含了错误消息的细节,我们添加了一个辅助函数将错误的详细数据格式化为字符串。我们将这个错误字符串传送到 E r r o r中,这样,在客户端可以通过 E r r o r对象的
D e s c r i p t i o n属性得到它。
FormatErrorMessage 方法如下:
上面讲述了如何从数据库中读数据,下面讨论如何将数据写入数据库。
3,写数据库在 I Ta b l e S t o r a g e 2中添加下列方法。它将 S T L数据结构中的信息写入数据库中。操作界面如图 1 8 - 1 2所示。
图 18-12 添加 Wr i t e方法第 1 8章 对 C + +组件的进一步讨论 计计 551下载用 A D O写数据库的代码如下:
和 R e a d方法一样,声明一些 A D O对象,建立与数据库的连接,并且打开数据表。
下面开始写数据库,采用与 O u t p u t Ta b l e方法相似的风格,遍历迭代 S T L数据结构完成:
c a t c h块与 R e a d方法中的完全相同,这里不再重复。
你应该已经熟悉了对 A D O的调用,但实现方式有些不同。例如,缺省 A D O方法不能直接使用。在 V B中,可用下列方法设置字段值:
而在 C + +中必须完全扩展方法的调用,如:
552计计 ASP 3 高级编程 下载另外一个差异是 C + +不能很好地支持 Va r i a n t类型。上面的例子的代码看上去不错,但它仅由字符型数据组成。如果数据类型混用的话,代码将变得混乱。下面介绍的 OLE DB者消费模板将使代码变得简洁。
18.3.2 OLE DB消费者模板
OLE DB消费者模板是一个相对新的方法,其目的是改善在 C + +中进行数据存取的性能。
它在 Visual C++ 6.0 中作为 ATL 3.0的一部分引入使用库扩展了 C + +功能,OLE DB消费者模板库是为了通过 OLE DB进行数据存取而设计的。这个库能够提供:
访问 OLE DB特征。
集成 AT L和 M F C。
数据库参数和列的绑定模型。
使用原有的 C / C + +数据类型进行 OLE DB编程。
另外,Visual C++的 A p p Wi z a r d可生成基本的 OLE DB消费者代码。
1,创建 OLE DB消费者在创建 OLE DB消费者前必须建立数据源,我们采用与 A D O例子中所用的数据库相似的
A c c e s s数据库。用在 ATL Object Wi z a r d添加一个新的 AT L对象,选择 Data Access类别并选择
C o n s u m e r,如图 1 8 - 1 3所示。
图 18-13 在 ATL Object Wi z a r d中添加对象的界面 1
点击 N e x t,选择所需的 OLE DB 提供者,因为我们选用了 O D B C驱动程序,所以选择
Microsoft OLE DB Provider for ODBC Drivers。如图 1 8 - 1 4所示。
选择所用的数据源名称为 M u s i c i a n D S N。用户名和口令没有输入,如果数据库需要用户名和口令,可在此对话框中输入,如图 1 8 - 1 5所示。
点击 O K按纽,然后选择所需的数据库表,如图 1 8 - 1 6所示。
再点击 O K,向导将自动选取一些名称,根据自己的需要可进行修改。如果将要添加记录,
可在 S u p p o r t部分选择 i n s e r t框,如图 1 8 - 1 7所示。
点击 O K后,向导产生两个类,C M u s i c i a n s A c c e s s o r和 C M u s i c i a n s,可完成数据类型转换等工作。我们将只直接使用 C M u s i c i a n s类,下一节再做说明。
第 1 8章 对 C + +组件的进一步讨论 计计 553下载图 18-16 在 ATL Object Wi z a r d中添加对象的界面 4
图 18-17 在 ATL Object Wi z a r d中添加对象的界面 5
554计计 ASP 3 高级编程 下载图 18-14 在 ATL Object Wi z a r d中添加对象的界面 2 图 18-15 在 ATL Object Wi z a r d中添加对象的界面 3
2,读数据库下面在 I Ta b l e S t o r a g e 2中添加使用新的 OLE DB消费者类读数据库的方法,由 ATL Object
Wi z a r d生成的 R e a d 2不带任何参数,因为 ATL Object Wi z a r d已经将数据源名称、用户名和口令
(如果你提供了 )硬编码进 C M u s i c i a n s类,如图 1 8 - 1 8所示。
图 18-18 生成 R e a d 2的屏幕界面
OLE DB消费者模板版本的 R e a d 2方法的代码比 A D O版本的代码更为简单:
如果上述代码没有编写的话,应在 Ta b l e S t o r a g e 2,c p p文件的顶部包含 M u s i c i a n s,h文件。
大部分工作已由 t h e M u s i c i a n s对象完成。当调用 O p e n后,就创建了与数据库的连接,而且打开了 M u s i c i a n s表。下面的代码建立数据结构,列名称映射由手工创建:
下面遍历数据库记录。在使用 OLE DB消费者模板时,要判定记录的结束,应检查
M o v e N e x t的返回值而不是检查 E O F属性。当调用 M o v e N e x t时,t h e M u s i c i a n s对象的成员变量自动填充,在读下一个记录前,必须先调用 C l e a r R e c o r d,否则当该记录的字段为 N U L L时,
前一记录的数据仍将占据成员变量。
第 1 8章 对 C + +组件的进一步讨论 计计 555下载上述代码比 A D O例子中的相应代码简洁得多。下面介绍写记录。
3,写数据库在 I Ta b l e S t o r a g e 2中再增加一个称为 Wr i t e 2
的新方法,数据库配置信息已经在 C M u s i c i a n s
类中硬编码,因此不必向 Wr i t e 2传送任何参数,
如图 1 8 - 1 9所示。
代码的开始与 R e a d 2相似,大部分工作由
t h e M u s i c i a n s对象完成。首先调用 O p e n以连接数据库和表。为了在数据库中添加一个记录,
先填充成员变量,然后调用 I n s e r t。对一个新记录来说,应首先调用 C l e a r R e c o r d,确保没有前一记录的数据遗留下来。
上面使用了称为 C o p y Va l u e的辅助方法。查找记录中的字段的值是重复性的工作,可用此方法减少代码的数量:
556计计 ASP 3 高级编程 下载图 18-19 生成 Wr i t e 2的屏幕界面
18.3.3 使用 A D O,还是使用 OLE DB消费者模板进行数据存取时,可选用 A D O或 OLE DB消费者模板。选用 A D O可重新利用你对 A D O对象模型的知识,代码修改也较容易,灵活性好。但 A D O不能很好地支持绑定到 C + +的数据类型,并且 Visual C++中没有相应的库和 A p p Wi z a r d支持。
选用 OLE DB消费者模板可从 Visual C++得到库和 A p p Wi z a r d支持。这意味着,Vi s u a l
C + +提供项目的基本结构,代码编写的速度较快,出现的错误也较少,但必须学习新的用于访问数据的 A P I。如果你要编写许多需要访问数据的组件,那么这是值得的。
18.4 小结本章创建了一个简单的 C + +服务器组件并增强其功能。 我们介绍了如何访问 A S P内置对象,
如何访问各种 C O M +接口。描述了数据存取的两种方法。 C + +中可使用 A D O对象模型,但需要进行大量的数据类型转换。 ATL Object Wi z a r d可创建 OLE DB消费者,生成的代码比 A D O
简洁,但灵活性较差。
有了这些工具,在设计基于网络的应用程序结构时,可以有更大的选择余地。
第 1 8章 对 C + +组件的进一步讨论 计计 557下载