电脑维修第一互动门户_www.PC106.com 为了方便您再次访问电脑维修站,请点击收藏本站!设为首页
操作系统 · 硬件学院 · 软件学院 · 网络学院 · DIY 经验 · 数据恢复 · 网站技术 · 维修网点 · IT 黄 页 · 大师答疑
故障症状 · 电脑优化 · 病毒快报 · 黑客安全 · 维修宝典 · 电脑保养 · 服 务 器 · 在线杀毒 · 在线电视 · 网址服务
维修 CPU·主板·硬盘·内存·显卡·显示器·键盘鼠标·声卡音箱·软驱光驱·打印机·机箱电源·BIOS·网卡·局域网·浏览器
您现在的位置: 电脑维修 >> 网站技术 >> ASP技术 >> ASP基础 >> 网站技术正文
数据访问
作者:佚名 文章来源:不详 点击数: 更新时间:2007-2-3 12:51:21


     服务器组件一般用于实现三层应用程序的业务规则,因此需要与数据库交互。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++向导可用于创建和使用OLEDB消费者。可以使用向导指向想要访问的数据库和表格,自动生成所需的代码。但是,因为消费者代码直接指向指定的数据库,所以不如使用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所示的数据库为例。

    假设对这个数据库已建立了一个称为MusicianDSN的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 ObjectWizard生成的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时,前一记录的数据仍将占据

[1] [2] 下一页

上网速度更快更爽、更安全下载使用Firefox火狐浏览器

网站技术录入:admin    责任编辑:admin 
  • 上一篇网站技术:

  • 下一篇网站技术:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

     IT图片报道

    14万元天价!640GB闪存硬盘美国问

    双核独显19寸液晶惠普PC机只卖49

    佳能MP160售价仅580元

    神舟双核液晶电脑3999起
     IT热点报道

    普通IT报道 中国电信称三年内实现光纤到户
    普通IT报道 广达个人电脑宣布已开始在江苏投入量产
    普通IT报道 14万元天价!640GB闪存硬盘美国问世
    普通IT报道 节后病毒猖獗系统瘫痪
    普通IT报道 AMD推出6款节能处理器
    推荐IT报道 双核独显19寸液晶惠普PC机只卖4999元
    普通IT报道 微软无奈下调Vista销售预期 XP仍是主角
    普通IT报道 佳能MP160售价仅580元
    推荐IT报道 神舟双核液晶电脑3999起
    推荐IT报道 4999元玩Vista 七喜12寸轻薄本升级
    关于公司 | 免责声明 | 广告服务 | 招贤纳士 | 联系我们 | 友情链接 1 2 3
    Copyright©2005 - 2007  http://www.PC106.com  All Right Reserved   
    桂ICP备06015569号