动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机 | DVBOX
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
   Asp → 阅读文章
  

 数据访问

作者来源: 
阅读 2895 人次 , 2006-4-3 0:50:00 


服务器组件一般用于实现三层应用程序的业务规则,因此需要与数据库交互。c++访问数据有两种方式: ado和ole db消费者模板。第1 2章我们已经讨论了通用数据访问(uda)、ado和ole db的作用。
从c++ ado与从asp或visual basic访问ado非常相似。使用完全一样的ado com对象(如adodb.recordset),只是用不同的语言创建和使用ado com对象。但使用ado时没有visual c++向导,必须编写所有的实现代码。这不仅须手工编写,而且还容易引入代码错误,因此应认真仔细。但是可从c++中得到完全可用的ado对象模型。
ole db消费者使用ole db提供者的服务访问数据。ado是ole db消费者的一个例子。使用c++可创建ole db消费者,完全跳过ado层。visual c++向导可用于创建和使用ole db消费者。可以使用向导指向想要访问的数据库和表格,自动生成所需的代码。但是,因为消费者代码直接指向指定的数据库,所以不如使用ado灵活。
18.3.1 通过c++使用ado
通过c++使用ado需要两种技能:理解ado对象模型和在c++中使用com对象。我们对ado对象模型已非常熟悉,但现在没有c++类库或模板库支持ado。因为ado在com上构造,使用ado与使用其他com对象相同。下面介绍一下使用步骤。
1. 设置使用ado
c++中使用com组件最简单的方法是用# import关键字导入组件的类型库。# import 指令围绕ado类型库产生瘦c++类,可以用接近于vbscript和visual basic的语句操作ado对象和接口。大部分ado例子用vbscript编写,用#import指令能很容易地将它们转换为c++,比在没有包装类(wrapper class)的情况下使用ado容易。
使用#import时,可以使用no_namespace属性,这样ado类型库内容就没有范围限制。但是,这会引起名称与eof的冲突,而rename属性可解决这个问题。在tablestorage2.cpp增加下列内容可导入ado类型库。

上述代码生成一个msado15.tlh文件和一个msado15.tli文件。msado15.tlh文件包含前向引用、smart指针声明和typeinfo声明。msado15.tli文件包含编译器产生的几个成员函数的实现。这两个文件用于观察和显示类型库中的可用内容。例如,下面是msado15.tlh文件对ado记录集的smart指针的声明:
_com_smartptr_typedef(_recordset,_uuideof(_recordset));
后面的例子将说明如何在代码中使用smart指针。在msado15.tlh中还有一些枚举量的声明,使得使用ado更为方便。下面是光标位置的枚举量声明:

如上所述,#import使得ado的使用更为轻松,因为这个指令可自动创建包装类和来自类型库的类型信息。但对c++程序员来说,将ado返回的va r i a n t数据类型转变为c/c++数据类型还是比较麻烦。ado 2.0和visual c++ 6.0用附加的ado vc++扩展解决了这个问题。这一章不讨论ado vc++扩展,有关内容可参考visual c++文献。
还增加了一个宏,这个宏可使程序容易理解,减少了嵌套代码的数量:

通过导入类型库,已可使用所有ado对象。下面介绍如何在c++中使用ado进行读写。我们将以图1 8 - 1 0所示的数据库为例。

假设对这个数据库已建立了一个称为musician dsn的odbc连接。
2. 读数据库
首先在itablestorage2中增加read方法。这个方法从数据库读记录,并将这些记录插入stl数据结构中,它的参数是dsn名称、用户名和口令。在对话框中,参数在implementation文本框中出现,如图1 8 - 11所示。

下面看一下这个方法的实现:

首先声明方法中使用的变量,注意如何使用atl smart指针的创建ado connection和recordset对象。为在代码中跟踪错误,我们采用了异常处理,因此开启一个try块。任何ado调用都用前面声明的safe_call宏包装,如果任一方法调用返回一个表明失败的值,就抛出一个异常:

首先打开到数据库的连接,这个连接用于recordset对象的open方法。

如果成功,可对数据库的记录进行遍历。首先必须确保内存中当前无数据:

现在,将数据库中的数据拷贝到内存中的stl数据结构内,遍历记录直到遇到文件结束标志eof。只在字段真的有值时才插入它,这样可以节约内存:

到目前为止,所有一切都在try 块中。如果有错误出现,程序流将进入catch 块。_com_error变量包含了错误消息的细节,我们添加了一个辅助函数将错误的详细数据格式化为字符串。我们将这个错误字符串传送到error中,这样,在客户端可以通过error对象的description属性得到它。

上面讲述了如何从数据库中读数据,下面讨论如何将数据写入数据库。
3. 写数据库
在itablestorage2中添加下列方法。它将s t l数据结构中的信息写入数据库中。操作界面如图1 8 - 1 2所示。



另外一个差异是c++不能很好地支持variant类型。上面的例子的代码看上去不错,但它仅由字符型数据组成。如果数据类型混用的话,代码将变得混乱。下面介绍的ole db者消费模板将使代码变得简洁。
18.3.2 ole db消费者模板
ole db消费者模板是一个相对新的方法,其目的是改善在c++中进行数据存取的性能。它在visual c++ 6.0 中作为atl 3.0的一部分引入使用库扩展了c++功能,ole db消费者模板库是为了通过ole db进行数据存取而设计的。这个库能够提供:
? 访问ole db特征。
? 集成atl和mfc。
? 数据库参数和列的绑定模型。
? 使用原有的c/c++数据类型进行ole db编程。
另外,visual c++的appwizard可生成基本的ole db消费者代码。
1. 创建ole db 消费者
在创建ole db消费者前必须建立数据源,我们采用与ado例子中所用的数据库相似的access数据库。用在atl object wizard添加一个新的atl对象,选择data access类别并选择consumer,如图1 8 - 1 3所示。

点击next,选择所需的ole db 提供者,因为我们选用了odbc驱动程序,所以选择microsoft ole db provider for odbc drivers。如图1 8 - 1 4所示。

选择所用的数据源名称为musician dsn。用户名和口令没有输入,如果数据库需要用户名和口令,可在此对话框中输入,如图1 8 - 1 5所示。

点击ok按纽,然后选择所需的数据库表,如图18 - 1 6所示。

 再点击ok,向导将自动选取一些名称,根据自己的需要可进行修改。如果将要添加记录,可在support部分选择insert框,如图1 8 - 1 7所示。

 点击ok后,向导产生两个类: cmusiciansaccessor和cmusicians,可完成数据类型转换等工作。我们将只直接使用cmusicians类,下一节再做说明。
 2. 读数据库
 下面在itablestorage2中添加使用新的ole db消费者类读数据库的方法,由atl object wizard生成的read2不带任何参数,因为atl object wizard已经将数据源名称、用户名和口令(如果你提供了)硬编码进cmusicians类,如图1 8 - 1 8所示。

ole db消费者模板版本的read2方法的代码比ado版本的代码更为简单:

如果上述代码没有编写的话,应在tablestorage2.cpp文件的顶部包含musicians.h文件。
大部分工作已由themusicians对象完成。当调用open后,就创建了与数据库的连接,而且打开了musicians表。下面的代码建立数据结构,列名称映射由手工创建:

下面遍历数据库记录。在使用ole db 消费者模板时,要判定记录的结束,应检查movenext的返回值而不是检查eof属性。当调用movenext时,themusicians对象的成员变量自动填充,在读下一个记录前,必须先调用clearrecord,否则当该记录的字段为null时,前一记录的数据仍将占据成员变量。


上述代码比ado例子中的相应代码简洁得多。下面介绍写记录。
3. 写数据库
在itablestorage2中再增加一个称为write2 的新方法,数据库配置信息已经在cmusicians类中硬编码,因此不必向write2传送任何参数,如图1 8 - 1 9所示。

代码的开始与read2相似,大部分工作由themusicians对象完成。首先调用open以连接数据库和表。为了在数据库中添加一个记录,先填充成员变量,然后调用insert。对一个新记录来说,应首先调用clearrecord,确保没有前一记录的数据遗留下来。

上面使用了称为c o p y va l u e的辅助方法。查找记录中的字段的值是重复性的工作,可用此方法减少代码的数量:


18.3.3 使用ado,还是使用ole db消费者模板
进行数据存取时,可选用ado或ole db消费者模板。选用ado可重新利用你对ado对象模型的知识,代码修改也较容易,灵活性好。但ado不能很好地支持绑定到c++的数据类型,并且visual c++中没有相应的库和appwizard支持。
选用ole db消费者模板可从visual c++得到库和appwizard支持。这意味着, visual c++提供项目的基本结构,代码编写的速度较快,出现的错误也较少,但必须学习新的用于访问数据的api。如果你要编写许多需要访问数据的组件,那么这是值得的。
本章创建了一个简单的c++服务器组件并增强其功能。我们介绍了如何访问asp内置对象,如何访问各种com+接口。描述了数据存取的两种方法。c++中可使用ado对象模型,但需要进行大量的数据类型转换。atl object wizard可创建ole db消费者,生成的代码比ado简洁,但灵活性较差。

 
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:事务处理的定义
· 下一篇:与COM+进行接口
· 在ADO使用SELECT语法一
· SUNWEN教程之----C#进阶(五)
· 用Asp隐藏文件路径,实现防盗链
· access数据库防止下载程序
· web应用程序中的数据库连接(1)


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077