admin 管理员组

文章数量: 1184232


2024年4月20日发(作者:yy广播器源码下载)

维普资讯

第20卷第5期 

2002拒5,q 

情 报科 学 V0I

May,2002 

_20,No.5 

用VC实现检索数据的XML存档 

刘 荣萧怀志 

(武汉大学信息管理学院,武汉430072) 

摘 要 本文论述了信鼠管理系统中用VC实现将检索的数据集以XML格式存档的基本原理和设计方 

法。 

关键词XML VC信息管理系统 

Saving Retrieval Data iⅡXML Format in VC++ 

I iu Rong Xiao Huaizhi 

(School of Information Management,Wuhan University,Wuhan430072) 

Abstract This paper mainly talks about how to support xml in MIS for Library by giving a sample in VC+ 

+The sample deFl30st-rates how tO save retrieval recordset in xm】 ̄ormat. 

Keywords XML VC M碍 

1 996年,万维网协会(或者叫W3C,http:∥ 

在VC一十6中实现对XMI 的支持,必须借助 

www.w3c.org)开始设计种可扩展的标记语言, 

于COM对象 COM表示Component Object Model 

使其能够将SGMI 的灵活性和强大功能与已经被 (组件对象模型),是Microsoft生成软件的标准 它 

广泛采用的HTMI 结合起来。这种后来变成XML 

是构造二进制兼容软件的规范,可以建立能够互相 

的语言继承了SGMI 的规范,而且实际上就是后者 

通信的组件,而不管这些组件是用什么编程语言和 

的 个子集 XMI 的数据描述机制意味着它将成 

工具建立的 在COM中,接口(interface)是最值 

为一种在Internet上共享信息的强大途径,因为: 

得编程人员注意的,它可以定义为一个连接,用于 

u)它是开放的 XMI 能够在不同的用户和程序之 控制应用程序对COM对象的访问。COM接口可以 

间交换数据,而不论其平台如何 (2)它的白描述 

用来访问包含指向对象方法的指针的表格 这个表 

的特性使其对于B2B和企业内部阿解决方案来说 

格(vtable)是一个包告指向成员对象方法的虚拟指 

是一种有效的选择 (3)无需事先协调,我们就可 

针表格,其作用与c++的vtable相同。COM中所 

以在程序之间共享数据 

有的接口都是接口lunknowm的振生接口。组件或 

XMI 具有自描述数据的能力,界定XMI 内容 

接口都由QUID(Globally Unique Identifier)来标 

的标记会给所界定的数据中的每一个元素命名。在 

识,GUID是个128位的整数,主要由机器号和产生 

标记中,拄们还会发现特定的属性,它们会为所描 

的时间组成.在理论上是唯一的。 

述的元素提供某些附加信息 同时由于XMI 具有 

为了能更好地、具体地说明在VC++6中实现 

天生的扩展性,因此XML能简便而快速地根据企 

检索书目信息并以XMI 格式存储检索结果,我们 

业、科学规范或者其他方面的需要来构造定制的标 

以一个实例来进行说明 

记集。同时,每一个企业t甚至每一个人)都可以 先在SQI SERVER 7.0中建立名为lib的数 

选择定义自己的XMI 标记集。这就为在不同的组 据库,创建书目表books,其sql语句为:CREATE 

织和计算机应用程序之间交换信息提供了一条途 

TABI E books( 

径 

bk code char(12)NOT NUI…I title varchar 

有鉴于此,在以共享信息资源为已任的信息管 

(4O)NOT NUI I , 

理系统中提供对XMI,的支持已经是当务之急 对 

author varchar(20)NUI I ,city varchar(20) 

如何将从关系数据库中检索出的数据以XMI 格式 

NUI I . 

存挡以供用户使用,是图书信息管理系统设计中必 

P t year char(4)XUI I ,ztc varchar(20) 

须考虑的问题 

NI T T. 

收稿日期 2002—02—18 

维普资讯

5期 用VC实现检索数据的XML存档 523 

class num varchar(20)NULL,data catalog 

datetime NULL) 

corn ptr t,它也被称为智能指针(smart 

pointer)。智能指针自动执行COM的 

Querylnter[ace、AddRef、Release函数。 

下面的代码演示了在程序中怎样用#import 

指令来暴加对ADO的支持。 

表中字段有图书条码bk code(也是主键之所 

在)、题名title、著作author、出版地city、出版年 

P t year、主题词ztc、分类号class num、分编 

日期date catalog。 

#import c:\program files\common files\ 

system\ado\msado]5.dll rename( EOF , 

adoEOF ) 

创建存储过程ado test,该存储过程用于根据 

书目题名检索书目信息,它带有一个题名参议 其 

sql语句为: 

CREATE PROCEDURE ado test@title 

arg varchar(40) 

AS 

select bk code,title,author,city,ZtC from 

books 

对end--of--file(EOF)改名是必须的。因为在 

个典型的VisualC++应用程序中,EoF已经用 

#define定义成一个常数一1。但是在ADO中,EOF 

被定义为类型Variant Bool的属性。不对用# 

import指令导人的ADO类型库生成的EOF再定 

义,编译时会产生错误,因为EOF属性名将被一1 

替代。编译器不会将它作为~个有效的变量名而返 

回编译错误的信息。 

操纵一个自动化对象分两步:(1)定义一个变 

量用来操纵一个COM对象。(2)宴例化一个COM 

Where title=@title arg 

创建缺省def date并将其绑定在books的 

date catalog列上,其缺省值为数据插人时的系统 

时间:create default def date as GETDATE()。 

要实现检索出数据并将结果集中的数据以xml 

文档的格式存档,我们不得不依赖ADO 由于ADO 

是一种标准的COM对象模型,凡是支持COM和 

Automation的开发平台(如Visual C一+)都可以 

调用ADO。ADo的对象模型比较简单,总共有6种 

对象并将被它赋予该变量。利用#import指令,用 

智能指针COIn ptr t的构造器传人一个有效的 

tom prt t:: 

CLSID或PRoGTD能用一行代码宴现上面的两步。 

我们也能申明对象的变量,再用

Connection实例的代码为: 

Createlnstanee()方法来宴例化该对象。如生成 

对象、4种集合。其中6种对象为:Connection、 

Command,Parameter, Recorderset、 Field 

C0nnecti0nPtr Connl—NULL: 

HRESULT hr=S OK; 

Property,4种集合是Fields集合、Properties集合、 

Parameters集合、Erros集合。值得注意的是ADO 

的对象模型几乎是一种平板结构。 

在Visuall C++中有三种方式操纵ADO;# 

import、MFC OI E中的ClassWizard、Windows 

hr=Conn1.CreateInstance(uuidof(Conn— 

ection)); 

ADO Recordset对象是ADo中最常用的对 

象,也是本信息管理系统中实现将从SQL 

SERVER 7.0中检索出的数据以XML格式存盘的 

关键 通俗的说,ADO Recordset对象代表的是整 

个记录集或是执行一个命令返回的结果。前面说过, 

ADO几乎是一个平行结果,这就意味着我们可以能 

过Command对象获得Recordset对象,而且尤其是 

Command对象对参数化查询具有不错的性能 步 

骤一般为: 

API中的COM 当然,#import是最强大的,可编 

写出在语法上几乎与VBA(Visual Basic for 

Applications)相同的代码 在调用(invoke)ADO 

对象前,必须初始化(initialize)OLE。当用#import 

导人一包含类型库的文件时,将生成对全局唯一标 

识符GUIDs(globally unique identifiers)的声明, 

ADO对象的包装类和在类型库中的被列举的类型。 

对于被引用的任何类型库,Visual C++将在编译 

时生成以下两个文件:以.tlh为扩展名的头文件 

(包含对类型库中列举的类型和对象的声明)、以 

(1)创建一个Command对象的实例 

CommandPtr cdl=NULI : 

hr=cd1.CreateInstance(uuidof(Command)); 

tli为扩展名的执行文件(对类型库中对象模型的 (2)为参数刨建ADO Parameter对象,这是通 

过调用Command对象的CreateParameter方法来 

实现。 

ParameterPtr parm—NULL{parm=cdl— 

每种方法的包装)。例如,你用#import导人 

msado15.dU,Visual C++将生成msado15+tlh和 

msado15.tli两个文件 #import指令利用到~个类 

维普资讯

524 情报科学 2O卷 

>CreateParameter(bstr t( title arg ), 

adBSTR,adParamlnput,40,title arg); 

NUI L);//将获取的字段值由变码类型转化为字符 

串ITI list.insertltem(nlndex,szTitle);∥将该字 

段值插入到列表框中的相应位置 

nlndex+_L; 

(3)用Command对象的Append方法将前一步 

中创建的Parameter对象加入到Command对象的 

Parameters集台中 

hr=cd1一>Parameters>Append(parm); 

Rsl ̄MoveNext();} 

将Recordset以XML格式文件保存是使用 

Recordset的xSave方法。xSave方法接受两个参 

(4)调用Command对象的Execute方法返回 

Recordset对象。 

cdl >CommandText一 ado test”; 

cdl一>CommandType=adCmdStoredProc; 

cdl>ActiveConneetion=eon; 

Rsl—edl >Execute(NUI I ,NULL, 1); 

这里ado test就是笔者在前面建立在SQL 

SERVER7.0中的一个存储过程。而con是ADO 

Connection对象的一个实例,指定其与之建立连接 

的数据源。 

ConnectionPtr con—NULL; 

hr—con Createlnstance(uuidof(Connection)) 

con—-C0nnectionSt ring一 DSN—test;UID= 

xhz:PWD=xiaoyao; ; 

con—'0pen t一 ”, , “ 

adConnectUnspecified); 

用Recordset对象的Fields集合可以访问记录 

集中的字段 为了访问Fields集台,你必须引用用 

Recordset对象的Fields属性 你必须调用用Fields 

对象的OetItem方法来取得所需要的Fields对象, 

用FieLds对象的Value属性就可以访问到字段的 

值 传给FieLds对象的Getltem方法的一个异构参 

议,可以是一个BSTR字符串,也可以是一个数字。 

下面的代码演示了利用Recordset对象从数据库中 

取出一个字段的值,并将其插入到列表控件中。 

variant t vTitle; 

char szTitle[20]; 

int nlndex=0; 

while(Rsl一>ADOEOF—VARIANT 

FAI SE) 

vT1tle.Clear(): 

vTitle—Rsl—Fie1ds斗Getltem( title )斗 

Value;∥获取字段的值 

ASSERT(vTitle.vt=VT BSTR); 

WideCharToMuhiByte(CP ACP,0,vBk 

code.bstrVa1. 

1,szBK code,sizeof(szBK code),NULL, 

数,一是文件名,一是存储格式。、若存储格式指定 

为adPersistXMI ,xSave就在指定的文件内写入 

UTF一8格式的文件流。这种格式被分为两部分: 

schema段和数据段。schema段显示的是对名字空 

间(也称名域,即namespace)、schema段和data段 

的申明。Schema定义符台XML数据的说明并能得 

到完全的校验。代码为: 

CFileDialog fd(FAI SE, xml ,NUI I ,OFN 

HIDEREAD0NLY j OFN OVERWRITEPROM 

PT, xm1(*xm1)*.xml );//打开以XML 

为文件扩展名的文件保存对话框 

if(fd.DoModa J O!一IDoK) 

return; 

CString pathname=fd.GetPathName():// 

获取设置的要保存检索结果的文件全名 

bstr t fn(pathname): 

Rsl—xSave(fn,adPersistXMI ):∥将检索 

结果在指定的文件中存储 

这样,程序就实现了将所检索出的数据以XMI 

格式存档的功能。 

以上程序在 ̄qndows 2000 Professiona1+VC一+ 

6.01_sQI SERVER 7.0环境下实现 

参考文献 

l Don W L】【]t Implementing ADo with Various Develop— 

ment Languages.MSDN Library 2001.1 Microsoft 

Corporation 

2 Eugene O Lafsen等著.王建华等译MFC Programming 

with Visual CT+6 Unleashed机械工业出版社,2000, 

2 

3 Jim Maloney编著,田雨等译Distributed COM Aplica 

tion Development Using X!isual cT+6.0.清华大学出版 

社,2000,9 

4 David J.Kruglinski等著.希望图书创作宣译.Progra— 

mming Visual C一+6 0.北京希望屯子出版杜,I 999.5 

(责任蝙辑 刘风勤) 


本文标签: 对象 数据 类型 检索 信息