




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、毕业设计(论文)word试题库工具插件的设计论文作者姓名:申请学位专业:申请学位类别:指导教师姓名(职称):论文提交日期:word试题库工具插件的设计摘 要编写试题、排版试卷一直以来都是一项繁重的工作。手工录入试题然后排版试卷工作量大且容易出错,试题的收集保存也是以文件的形式,这使得查找试题变得相当困难。改用数据库存储试题将使试题的存储和查找得到优化,这是大部分试题库软件的优势,但是这些试题库软件都使用软件自身的文本编辑器,功能十分有限,在数据的存储方面也只能存储纯文本的试题,不能存储图片、表格等。这使得用户在编辑试题时十分不便,在数据的存储方面也有很大限制。如果结合数据库的存储功能、结构化查
2、询语言的查询功能和word的文本编辑功能,利用word进行试题编写、试卷排版,利用数据库存储试题,利用结构化查询语言查找试题、过滤显示同类试题,那么编写试题、排版试卷等工作将变得方便快捷。为了实现word与数据库之间的试题存取(能够支持图片、表格、公式的存取)以及其他一些功能编写的word试题库工具插件以com组件的形式嵌入word程序中,通过它将word与试题数据库有效的结合到一起,使用户既能够方便的编辑试题又能够将试题存入数据库或从数据库中取出,还能够通过结构化查询语句搜索试题。关键词:com组件;word 插件;二进制字段;结构化查询语言the design of an msword a
3、ddin for the test question bankabstractediting test questions and typesetting examination papers is always an arduous work, which is tedious and easy to make mistake. besides, the collection of the test questions is in the form of files that makes it difficult to search proper test questions. using
4、the database to store test questions can improve the searching function for the test questions, but such softwares almost use their own text editors with limited format control functions. at the aspect of their storage form, they commonly only save test questions in plain text, which means they can
5、hardly store the pictures or tables that may be nesscesary in the test question. considering that large part of test questions are edited in msword, if we can utilize the powerful format control function combined with the binary data storage function of the database to provide a localized test quest
6、ion management tool, the work of editing test questions and typesetting examination papers would become more effective and convinent. with the help of com component technology, such a tool can be implemented in the form of word addin that can integrate msword and the test question bank seamlessly an
7、d facilitate the users to store the test question into the bank and retrieve test questions selectively by the structural query language (sql).key words: com; word addin; binary field; sql目 录论文总页数:33页1 引言11.1 课题背景11.2 国内外研究现状11.3 本课题研究的意义12 理论基础12.1 com组件技术12.1.1 什么是com组件12.1.2 com组件的基本元素22.1.3 关键接口
8、32.1.4 如何创建com对象42.1.5 如何删除com对象52.2 word对象模型62.2.1 什么是word对象模型62.2.2 word对象模型抽象图62.2.3 主要对象模型介绍72.3 数据库技术72.4 odl文件语法82.4.1 odl文件语法结构82.4.2 类型库tlb的使用方法102.5 ado技术112.5.1 什么是ado技术112.5.2 如何在vb中使用ado122.5.3 ado技术主要应用举例152.6 插件技术202.6.1 什么是插件202.6.2 主流插件简介203 需求分析与方案设计213.1 什么是word试题库工具插件213.2 word试题库
9、工具插件的功能需求分析213.2.1 创建题库功能223.2.2 打开试题库功能223.2.3 存储试题功能223.2.4 提取试题功能223.2.5 删除试题功能223.2.6 预览试题功能223.2.7 搜索试题功能223.2.8 过滤试题功能233.3 word试题库工具插件的结构设计233.3.1 数据库结构233.3.2 主程序结构234 详细设计与实现234.1 已实现的功能234.2 在word中添加按钮的实现过程244.2.1 实现原理244.2.2 关键代码244.2.3 相关技术的运用254.3 试题存储的实现过程254.3.1 实现原理254.3.2 关键代码264.3.
10、3 相关技术的运用274.4 试题提取的实现过程284.4.1 实现原理284.4.2 关键代码284.4.3 相关技术的运用305 测试和分析30结 论30参考文献31致 谢32声 明331引言1.1课题背景目前大量试题使用word编写,在word中可以很方便地编写公式、插入图片和表格。一些独立的试题库软件使用简单的文本编辑功能,在试题编辑方面没有word方便。但是word仅能编辑试题,不能存储收集试题。word试题库工具插件以com组件的形式嵌入word程序中,通过它将word与数据库有效的结合到一起,从而使用户既能够方便的编辑试题又能够将试题存入数据库或从数据库中取出。1.2国内外研究现
11、状大多数试题库软件都使用软件自身的文本编辑器,功能十分有限;在数据的存储方面只能存储纯文本的试题,不能存储图片、表格等,这使得用户在编辑试题时十分不便,在数据的存储方面也有很大限制。1.3本课题研究的意义通过综合运用com组件技术、插件技术、数据库技术开发的word试题库工具插件能嵌入word程序内,从而将word与数据库有效的结合到一起。使用户在编辑试题时既能用word方便快捷的编辑试题又能方便的将试题存入数据库或从数据库提取试题。使试题编辑工作更加方便快捷。2理论基础2.1 com组件技术2.1.1什么是com组件com 即组件对象模型,是component object model的缩写
12、。com 是一种跨应用和语言共享二进制代码的方法。与c+不同,它提倡源代码重用。atl 便是一个很好的例证。源码级重用虽然好,但只能用于c+。它还带来了名字冲突的可能性,更不用说不断拷贝重用代码而导致工程膨胀和臃肿。windows 使用dlls 在二进制级共享代码。这也是windows 程序运行的关键重用kernel32.dll, user32.dll 等。但dlls 是针对c 接口而写的,它们只能被c 或理解c 调用规范的语言使用。由编程语言来负责实现共享代码,而不是由dlls 本身。这样的话dlls 的使用受到限制。mfc 引入了另外一种mfc 扩展dlls 二进制共享机制。但它的使用仍受
13、限制只能在mfc 程序中使用。com 通过定义二进制标准解决了这些问题,即com 明确指出二进制模块(dlls 和exes)必须被编译成与指定的结构匹配。这个标准也确切规定了在内存中如何组织com 对象。com 定义的二进制标准还必须独立于任何编程语言(如c+中的命名修饰)。一旦满足了这些条件,就可以轻松地从任何编程语言中存取这些模块。由编译器负责所产生的二进制代码与标准兼容。这样使后来的人就能更容易地使用这些二进制代码。在内存中,com 对象的这种标准形式在c+虚函数中偶尔用到,所以这就是为什么许多com 代码使用c+的原因。但是记住,编写模块所用的语言是无关的,因为结果二进制代码为所有语言
14、可用。2.1.2 com组件的基本元素coclass(简称组件对象类component object class)被包含在dll 或exe 中,并且包含着一个或者多个接口的代码。组件对象类(coclasss)实现这些接口。com 对象在内存中表现为组件对象类(coclasss)的一个实例。注意com“类”和c+“类”是不相同的,尽管常常com 类实现的就是一个c+类。com 服务器是包含了一个或多个coclass 的二进制dll 或exe。注册(registration)是创建注册表入口的一个过程,告诉windows 操作系统com 服务器放在什么位置。取消注册(unregistration)
15、则相反从注册表删除这些注册入口。guid(谐音为“fluid”,意思是全球唯一标示符globally unique identifier)是个128 位的数字。它是一种独立于com 编程语言的标示方法。每一个接口和coclass 有一个guid。因为每一个guid 都是全球唯一的,所以避免了名字冲突(只要用com api 创建它们)。有时还会碰到另一个术语uuid(意思也是全球唯一标示符universally iqueidentifier)。uuids 和guids 在实际使用时的用途是一样的。类id 或者clsid 是命名coclass 的guid。接口id 或者iid 是命名接口的guid
16、。在com 中广泛地使用guid 有两个理由:1、guids 只是简单的数字,任何编程语言都可以对之进行处理。2、guids 可以在任何机器上被任何人创建,一旦完成创建,它就是唯一的。因此,com开发人员可以创建自己特有的guids 而不会与其它开发人员所创建的guids 有冲突。这样就消除了集中授权发布guids 的必要。hresult 是com 用来返回错误和成功代码的整型数字。除此之外,别无它意,虽然以h作前缀,但没有句柄之意。最后,com 库是在使用com 时与交互的操作系统的一部分,它常常指的就是com 本身。但是为了避免混淆才分开描述的。使用和处理com 对象每一种语言都有其自己处
17、理对象的方式。例如,c+是在栈中创建对象,或者用new 动态分配。因为com 必须独立于语言,所以com 库为自己提供对象管理例程。下面是对com对象管理和c+对象管理所做的一个比较:创建一个新对象c+中,用new 操作符,或者在栈中创建对象。com 中,调用com 库中的api。删除对象c+中,用delete 操作符,或将栈对象踢出。com 中,所有的对象保持它们自己的引用计数。调用者必须通知对象什么时候用完这个对象。当引用计数为零时,com 对象将自己从内存中释放。由此可见,对象处理的两个阶段:创建和销毁,缺一不可。当创建com 对象时要通知com库使用哪一个接口。如果这个对象创建成功,c
18、om 库返回所请求接口的指针。然后通过这个指针调用方法,就像使用常规c+对象指针一样。2.1.3关键接口iunknown接口每一个com 接口都派生于iunknown。这个名字有点误导人,其中没有未知(unknown)接口的意思。它的原意是如果有一个指向某com 对象的iunknown 指针,就不用知道潜在的对象是什么,因为每个com 对象都实现iunknown。iunknown 有三个方法:addref() 通知com 对象增加它的引用计数。如果你进行了一次接口指针的拷贝,就必须调用一次这个方法,并且原始的值和拷贝的值两者都要用到。在本文的例子中没有用到addref()方法。release(
19、) 通知com 对象减少它的引用计数。参见前面的release()示例代码段。queryinterface() 从com 对象请求一个接口指针。当coclass 实现一个以上的接口时,就要用到这个方法。iclassfactory接口iclassfactory 的作用是创建com 组件。创建组件的责任交给了一个单独的对象,这个对象就是类厂。每个组件都必须有一个与之相关的类厂,这个类厂知道怎么样创建组件,当客户请求一个组件对象的实例时,实际上这个请求交给了类厂,由类厂创建组件实例,然后把实例指针交给客户程序。这个过程在跨进程及远程创建组件时特别有用,因为这时就不是一个简单的new 操作就可以的了,
20、它必须要经过调度,而这些复杂的操作都交给类厂对象去做了。iclassfactory 最重要的一个函数就是createinstance,顾名思议就是创建组件实例,一般情况下我们不会直接调用它,api 函数都为我们封装好它了,只有某些特殊情况下才会由我们自己来调用它。idispatch接口idispatch 叫做调度接口。调度接口把每一个函数每一个属性都编上号,客户程序要调用这些函数属性的时侯就把这些编号传给idispatch 接口就行了,idispatch 再根据这些编号调用相应的函数。idispatch 接口的主要函数是invoke,客户程序都调用它,然后invoke 再调用相应的函数。2.1
21、.4如何创建com对象为了创建com 对象并从这个对象获得接口, 必须调用com 库的api 函数,cocreateinstance()。其原型如下:hresult cocreateinstance (refclsid rclsid,lpunknown punkouter,dword dwclscontext,refiid riid,lpvoid* ppv );以下是参数解释:rclsidcoclass 的clsid,例如,可以传递clsid_shelllink 创建一个com 对象来建立快捷方式。punkouter这个参数只用于com 对象的聚合,利用它向现有的coclass 添加新方法。参
22、数值为null 表示不使用聚合。dwclscontext表示所使用com 服务器的种类。本文使用的是最简单的com 服务器,一个进程内(in-process)dll,所以传递的参数值为clsctx_inproc_server。注意这里不要随意使用clsctx_all(在atl 中,它是个缺省值),因为在没有安装dcom 的windows95系统上会导致失败。riid请求接口的iid。例如,可以传递iid_ishelllink 获得ishelllink 接口指针。ppv接口指针的地址。com 库通过这个参数返回请求的接口。当调用cocreateinstance()时,它负责在注册表中查找com
23、服务器的位置,将服务器加载到内存,并创建所请求的coclass 实例。以下是一个调用的例子,创建一个clsid_shelllink 对象的实例并请求指向这个对象ishelllink 接口指针。hresult hr;ishelllink* pisl;hr = cocreateinstance ( clsid_shelllink, / coclass 的clsidnull, / 不是用聚合clsctx_inproc_server, / 服务器类型iid_ishelllink, / 接口的iid(void*) &pisl ); / 指向接口的指针if ( succeeded ( hr ) )/ 用p
24、isl 调用方法else/ 不能创建com 对象,hr 为出错代码首先声明一个接受cocreateinstance()返回值的hresult 和ishelllink 指针。调用cocreateinstance()来创建新的com 对象。如果hr 接受到一个表示成功的代码,则succeeded 宏返回true,否则返回false。failed 是一个与succeeded 对应的宏用来检查失败代码。2.1.5如何删除com对象前面说过,不用释放com 对象,只要告诉它们已经用完对象。iunknown 是每一个com对象必须实现的接口,它有一个方法,release()。调用这个方法通知com 对象不
25、再需要对象。一旦调用了这个方法之后,就不能再次使用这个接口,因为这个com 对象可能从此就从内存中消失了。如果的应用程序使用许多不同的com 对象,因此在用完某个接口后调用release()就显得非常重要。如果不释放接口,这个com 对象(包含代码的dlls)将保留在内存中,这会增加不必要的开销。如果的应用程序要长时间运行,就应该在应用程序处于空闲期间调用cofreeunusedlibraries() api。这个api 将卸载任何没有明显引用的com 服务器,因此这也降低了应用程序使用的内存开销。继续用上面的例子来说明如何使用release():/ 像上面一样创建com 对象, 然后,if
26、( succeeded ( hr ) )/ 用pisl 调用方法/ 通知com 对象不再使用它pisl-release();2.2 word对象模型2.2.1什么是word对象模型microsoft office word 2003 对象是按层次顺序排列的,层次结构顶端的两个主类是 application 类和 document 类。这两个类非常重要,因为在大部分时间里,您要么是在使用 word 应用程序本身,要么是以某种方式处理 word 文档。word 对象模型严格遵循用户界面。application 对象提供整个应用程序的包装,每个 document 对象表示单个 word 文档,par
27、agraph 对象对应单个段落,等等。这些对象各自都有很多方法和属性,您可以使用这些方法和属性操作对象或与对象交互。当您在 visual studio .net 中创建新的 word 项目时,可以选择创建新的 word document 项目或 word template 项目。visual studio .net 在新的 word 项目中自动为 document 项目和 template 项目创建 thisdocument.vb 或 thisdocument.cs 代码文件。thisdocument 文件包含一个名为 officecodebehind 的公共类。officecodebehin
28、d 类包含包装 word.document 对象和 word.application 对象的代码。这两个变量是 officecodebehind 类的成员: thisdocument允许访问 word 中的所有内置 document 成员,包括方法、属性及事件。 thisapplication访问 application 对象的所有成员,包括事件。这样,只需要使用 thisdocument 和 thisapplication,就可以轻松访问代码中的对象;而不必分别声明 word.document 或 word.application 对象。注意生成的项目模板代码使用类型转换,因为许多 word
29、 方法和属性都返回 object 类型。例如,给 _startup 过程传递的是对象类型形式的名为 application 和 document 的变量,转换函数用于分别将每个变量显式转换为 word.application 和 word.document 对象。2.2.2 word对象模型抽象图图1:word对象模型2.2.3主要对象模型介绍1、application 对象application 对象表示 word 应用程序,是其他所有对象的父级。它的所有成员通常作为一个整体应用于 word。可以使用该对象的属性和方法来控制 word 环境。有关更多信息,请参见 word 的 applica
30、tion 对象。2、document 对象document 对象是 word 编程的中枢。当您打开文档或创建新文档时,就创建了新的 document 对象,该对象被添加到 word 的 documents 集合中。焦点所在的文档叫做活动文档,由 application 对象的 activedocument 属性表示。有关更多信息,请参见 word 的 document 对象。3、selection 对象selection 对象表示当前选择的区域。在 word 用户界面中执行某项操作(例如,对文本进行加粗)时,应首先选择或突出显示文本,然后应用格式设置。selection 对象始终存在于文档中。
31、如果未选中任何对象,它表示插入点。此外,该对象还可以表示多个不连续的文本块。有关更多信息,请参见 word 的 selection 对象。4、range 对象range 对象表示文档中的一个连续的区域,由一个起始字符位置和一个结束字符位置定义。range 对象的数量并不局限于一个。您可以在同一文档中定义多个 range 对象。range 对象具有以下特性:它的组成成分可以是单独的插入点,也可以是一个文本范围或整个文档;它包含非打印字符,例如空格、制表符和段落标记;它可以是当前选择所表示的区域,也可以表示当前选择之外的区域;它不随文档保存,仅存在于代码运行期间。在向一个范围的末尾插入文本时,wo
32、rd 会自动扩展该范围以包含插入的文本。有关更多信息,请参见 word 的 range 对象。2.3数据库技术数据库是依照某种数据模型组织起来并存放二级存储器中的数据集合。这种数据集合具有如下特点:尽可能不重复,以最优方式为某个特定组织的多种应用服务,其数据结构独立于使用它的应用程序,对数据的增、删、改和检索由统一软件进行管理和控制。从发展的历史看,数据库是数据管理的高级阶段,它是由文件管理系统发展起来的。数据库的基本结构分三个层次,反映了观察数据库的三种不同角度。 (1)物理数据层。它是数据库的最内层,是物理存贮设备上实际存储的数据的集合。这些数据是原始数据,是用户加工的对象,由内部模式描述
33、的指令操作处理的位串、字符和字组成。(2)概念数据层。它是数据库的中间一层,是数据库的整体逻辑表示。指出了每个数据的逻辑定义及数据间的逻辑联系,是存贮记录的集合。它所涉及的是数据库所有对象的逻辑关系,而不是它们的物理情况,是数据库管理员概念下的数据库。(3)逻辑数据层。它是用户所看到和使用的数据库,表示了一个或一些特定用户使用的数据集合,即逻辑记录的集合。数据库不同层次之间的联系是通过映射进行转换的。数据库具有以下主要特点:(1)实现数据共享。数据共享包含所有用户可同时存取数据库中的数据,也包括用户可以用各种方式通过接口使用数据库,并提供数据共享。(2)减少数据的冗余度。同文件系统相比,由于数
34、据库实现了数据共享,从而避免了用户各自建立应用文件。减少了大量重复数据,减少了数据冗余,维护了数据的一致性。(3)数据的独立性。数据的独立性包括数据库中数据库的逻辑结构和应用程序相互独立,也包括数据物理结构的变化不影响数据的逻辑结构。(4)数据实现集中控制。文件管理方式中,数据处于一种分散的状态,不同的用户或同一用户在不同处理中其文件之间毫无关系。利用数据库可对数据进行集中控制和管理,并通过数据模型表示各种数据的组织以及数据间的联系。(5)数据一致性和可维护性,以确保数据的安全性和可靠性。主要包括:安全性控制:以防止数据丢失、错误更新和越权使用;完整性控制:保证数据的正确性、有效性和相容性;并
35、发控制:使在同一时间周期内,允许对数据实现多路存取,又能防止用户之间的不正常交互作用;故障的发现和恢复:由数据库管理系统提供一套方法,可及时发现故障和修复故障,从而防止数据被破坏2.4 odl文件语法2.4.1 odl文件语法结构attributeslibrary libnamedefinitions;其中:attributes:定义库的属性。包括,如帮助文件,uuid,版本等。如: uuid(cf9d9b76-ec4b-470d-99dc-aec6f36a9261), helpstring(vb iobjectwithsite interface), version(1.0) library
36、 libname:定义一个库。其中可以包括多个接口。库定义包括:定义导入的其它类型库modules, interfaces, dispinterfaces, and coclassesdata types:枚举、联合、结构 ;库定义的内容:imported libraries:引入其它类型库。如:importlib(“stdole2.tlb”)2modules, interfaces, dispinterfaces, and coclasses:attributes/包括:uuid,helpstr等。元素关键字(module, interface, dispinterface, coclass
37、es)成员描述3数据类型定义(至少有一个)包括别名alias、枚举、联合、结构等:语法:typedef attributes typekind typename /使用c的typedef语法成员描述如:typedef public long guidptr;typedef public enum myenum解释:dispinterface:dispatch接口。定义使用dispatch.invoke可以调用的方法和属性。这些方法和属性不使用vtbl方式调用,提供给不支持vtbl的语言的自动化使用。vtbl:一个普通接口就是一个函数指针的表(vtbl)。在c、c+等语言的客户端源代码中,使用接
38、口的方法名调用方法,编译器根据方法名找到方法在vtbl中的位置,在生成的二进制代码中以位置代替了名称。这称为前期绑定。但如vbscript, jscript等脚本不支持前期绑定,即不支持vtbl。这样com服务器组件就必须提供idispatch接口。该接口定义了可以分发的方法的编号。脚本语言使用编号调用这些方法(使用idispatch接口的invoke()方法)。coclass: com中的类(或者说activex中的类)。对应与cpp中的类定义。odl中声明的coclass可以使用new关键字创建,或使用cocreateobject创建。2.4.2类型库tlb的使用方法midl编译器生成的类
39、型库包含一些标准的接口,如:itypelib,itypelibinfo等。类型库查看器(如oleviewer),或编程环境使用这些接口从tlb中读取信息。vc编译器不仅读取信息,而且将其转换为c或c+的头文件。这样在c或c+的源代码中才能使用其中的接口、数据和类定义。语法为:#imports “类型库(tlb或odl)”如果在stdafx.h中引入类型库,编译stdafx.cpp后,就会产生相应的.h文件。详细情况:编译器产生两个头文件:.tlh和tli。存放在编译选项/fo指定的目录中。(一般为debug, release目录)其中包括了数据类型定义、常量定义、smart接口指针定义(包括c
40、oclass)、以及接口的guid。smart接口指针:_com_smartptr_typedef(imyinterface, _uuidof(imyinterface);程序中使用:imyinterfaceptr。可以使用_com_ptr_t获得而不需要调用queryinterface,addref,releaseref等iunknown接口方法。注意包含:comdef.h。smart接口指针使用方式:对coclass对象的接口,可以通过在_com_ptr_t的构造函数中传导clsid或progid,自动创建对象。如:_com_ptr_t ptr(clsid或progid);对于interf
41、ace,由于其对象由coclass对象的某些方法创建,本来这些方法返回iunknown指针,但使用_com_ptr_t可以自动转换为相应类型的接口智能指针。接口的guid。形式为:clsid_coclassiid_interfaceguid用于非模板方式的com使用。如使用cocreateinstance(clsid)创建com对象,使用queryinterface获得接口指针。vb中,通过“工程引用”来引入类型库。注意,有的组件并未生成独立的类型库。而其信息包含在com组件本身中(如dll,exe文件中)。条件是组件中包含itypelib, itypelibinfo这些接口。2.5 ado技
42、术2.5.1什么是ado技术ado (activex data objects,activex数据对象)是microsoft提出的应用程序接口(api)用以实现访问关系或非关系数据库中的数据。例如,如果您希望编写应用程序从db2或oracle数据库中向网页提供数据,可以将ado程序包括在作为活动服务器页(asp)的html文件中。当用户从网站请求网页时,返回的网页也包括了数据中的相应数据,这些是由于使用了ado代码的结果。象microsoft的其它系统接口一样,ado是面向对象的。它是microsoft全局数据访问(uda)的一部分,microsoft认为与其自己创建一个数据,不如利用uda访
43、问已有的数据库。为达到这一目的,microsoft和其它数据库公司在它们的数据库和microsoft的ole数据库之间提供了一个“桥”程序,ole数据库已经在使用ado技术。ado的一个特征(称为远程数据服务)支持网页中的数据相关的activex控件和有效的客户端缓冲。作为activex的一部分,ado也是microsoft的组件对象模式(com)的一部分,它的面向组件的框架用以将程序组装在一起。ado从原来的microsoft数据接口远程数据对象(rdo)而来。rdo与odbc一起工作访问关系数据库,但不能访问如isam和vsam的非关系数据库。ado 是对当前微软所支持的数据库进行操作的最
44、有效和最简单直接的方法,它是一种功能强大的数据访问编程模式,从而使得大部分数据源可编程的属性得以直接扩展到的active server 页面上。可以使用ado 去编写紧凑简明的脚本以便连接到 open database connectivity (odbc) 兼容的数据库和 ole db 兼容的数据源,这样 asp 程序员就可以访问任何与 odbc 兼容的数据库,包括 ms sql server、access、 oracle 等等。比如,如果网站开发人员需要让用户通过访问网页来获得存在于ibm db2或者oracle数据库中的数据,那么就可以在asp页面中包含ado程序,用来连接数据库。于是,
45、当用户在网站上浏览网页时,返回的网页将会包含从数据库中获取的数据。而这些数据都是由ado代码做到的。ado是一种面向对象的编程接口,微软介绍说,与其同ibm和oracle提倡的那样,创建一个统一数据库,不如提供一个能够访问不同数据库的统一接口,这样会更加实用一些。为实现这一目标,微软在数据库和微软的ole db中提供了一种“桥”程序,这种程序能够提供对数据库的连接。开发人员在使用ado时,其实就是在使用ole db,不过ole db更加接近底层。ado的一项属性?远程数据服务,支持“数据仓库”activex 组件以及高效的客户端缓存。作为activex的一部分,ado也是com组件的一部分。a
46、do是由早期的微软数据接口?远程数据对象rdo演化而来的。rdo同微软的odbc一同连接关系数据库,不过不能连接非关系数据库。ado向我们提供了一个熟悉的,高层的对ole db的automation封装接口。对那些熟悉rdo的程序员来说,可以把ole db比作是odbc驱动程序。如同rdo对象是odbc驱动程序接口一样,ado对象是ole db的接口;如同不同的数据库系统需要它们自己的odbc驱动程序一样,不同的数据源要求它们自己的ole db提供者(ole db provider)。目前,虽然ole db提供者比较少,但微软正积极推广该技术,并打算用ole db取代odbc。ado向vb程序
47、员提供了很多好处。包括易于使用,熟悉的界面,高速度以及较低的内存占用(已实现ado2.0的msado15.dll需要占用342k内存,比rdo的msrdo20.dll的368k略小,大约是dao3.5 的dao350.dll所占内存的60)。同传统的数据对象层次(dao和rdo)不同,ado可以独立创建。因此可以只创建一个 connection对象,但是可以有多个,独立的recordset对象来使用它。ado针对客户服务器以及web应用程序作了优化。2.5.2如何在vb中使用ado一旦安装了ado,在vb的工程-引用对话框中就可以看到象下图所示的东西了:选择 activex data obje
48、cts 1.5 library (adodb).在其下的 ado recordset 1.5 library是一个客户端的版本(ador),它定义了有聚的数据访问对象。ador 对于客户端的数据访问来说是足够的了,因为不需要connection对象来建立与远程数据源的联系。如果想要访问更多的外部数据源,需要安装这些外部数据源自己的ole db provider,就象需要为新的数据库系统安装新的odbc驱动程序一样。如果该外部数据源没有自己的ole db provider,就得使用ole db sdk来自己为这个外部数据源创建一个ole db provider了。示例下面的示例代码以northw
49、inds数据库作为远程数据源,然后用ado来访问它。首先在控制面板中打开“32位数据源”,单击“添加”按钮。在弹出的对话框中选择 microsoft access driver (*.mdb) 作为数据源驱动程序。然后按下图所示,在对话框中填写下面的内容选择数据库northwinds所在路径。单击完成,退出odbc设备管理器。启动一个新的vb工程,在窗体的load事件中输入下面的代码:private sub form_load()dim cn as adodb.connectionset cn = new adodb.connectionset connection propertiescn.
50、connectionstring = dsn=rdc nwind;uid=;pwd=;cn.connectiontimeout = 30cn.openif cn.state = adstateopen then _msgbox connection to northwind successful!cn.closeend sub按f5运行程序,看看,一个消息框弹出来告诉连接成功了。请注意,这里我特别注明了是adodb.connection,而不是ador.connection,这样做是为了将二者区分开(如果引用了adodb和ador的话,这样做很有必要)。连接字符串看上去同rdo的连接字符串差不
51、多。事实上,二者确实差不多。如果我们要访问一个sql server数据库,的connection代码看上去应象下面所示:设置连接属性cn.provider = msdasqlcn.connectionstring = driver=sql server; & server=prod1;uid=bg;pwd=;database=maincn.openprovider属性指向sql server的ole db provider.回到我们的示例程序,让我们创建一个recordset对象来访问“orders”表,并从该表的shipcountry字段中产生头十个不重复的国家名。修改窗体load事件中的代
52、码,让它看上去象下面这样。private sub form_load()dim cn as adodb.connectiondim rs as adodb.recordsetdim ssql as stringdim sout as stringdim count as integerset cn = new adodb.connectionset rs = new adodb.recordset set properties of the c.connectionstring = dsn=rdc nwind;uid=;pwd=;cn.connectiontimeout
53、 = 30cn.openif cn.state = adstateopen then _msgbox connection to northwind successful!ssql = select distinct orders.shipcountry from ordersset rs = cn.execute(ssql)enumerate the recordsetsout = for count = 1 to 10sout = sout & rs(shipcountry) & vbcrlfrs.movenextnext countmsgbox sout, vbexclamation,
54、ado resultsend sub运行程序后,会看到如下图所示的消息框。不幸的是,目前这个recrodset对象是只读的和forward cursor。如果想要获取更多的功能,需要创建一个独立的recordset对象,该对象拥有自己的connection属性,就象下面的代码所示:private sub form_load()dim rs as adodb.recordsetdim ssql as stringdim sout as stringdim count as integerset rs = new adodb.recordsetssql = select distinct orde
55、rs.shipcountry from ordersrs.open ssql, dsn=rdc nwind;uid=;pwd=;, adopendynamicreport recordset connection informationmsgbox rs.activeconnection, , connection infoenumerate the recordsetsout = for count = 1 to 10sout = sout & rs(shipcountry) & vbcrlfrs.movenextnext countmsgbox sout, vbexclamation, a
56、do resultsrs.closeend sub上面代码返回的结果同前例一样,但是本代码中的recordset是独立的。这一点是dao和rdo做不到的。recordset对象的open方法打开一个代表从sql查询返回的记录的游标。虽然可以用connection对象同远程数据源建立连接,但请记住,在这种情况下,connection对象和recordset对象是平行的关系。2.5.3 ado技术主要应用举例ado(activex data objects)是基于组件的数据库编程接口,它是一个和编程语言无关的com组件系统。本文主要介绍用ado编程所需要注意的技巧和在vc下进行ado 编程的模式,并对cextensions进行了简单的讨论,希望对ado开发人员有一定的帮助作用。因为ado是一个和编程语言无关的com组件系统,所以这里讨论的要点适用于所有的编程语言和编程环境,比如:vb、vbscript、vc、java等等。编程技巧1显式定义对象类型实际上,这条准则不仅适用于ado编程,也适用于其他的与com对象相关的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030年中国外螺纹活接头数据监测研究报告
- 2025至2030年中国全棉素色羽绒被数据监测研究报告
- 2025至2030年中国6N高纯铜数据监测研究报告
- 2025年中国蛋白质饮料生产线设备市场调查研究报告
- 2025年中国航空障碍标志灯市场调查研究报告
- 2025年中国碱式乙酸铅市场调查研究报告
- 2025年度办公室租赁与人力资源招聘合同
- 数字时代校园欺凌防治措施的创新
- 技术研讨会小组组织与管理方案
- 文物保护与城市规划的协调措施
- 第1.1课-七律二首-送瘟神-【中职专用】高二语文同步备课课件(高教版2023职业模块)
- (沪教牛津版)深圳市小学1-6年级英语单词默写表(英文+中文+默写)
- 初中语文跨学科资源融合教学研究
- 慢病管理课件-高血压、糖尿病等慢性病的护理和管理
- 英语教学方法与策略
- 春秋季六年级奥数培训教材全0
- 【实用资料】食物中毒现场卫生学采样PPT
- 抗原 抗原(免疫学检验课件)
- 《撰写演讲稿》-省赛一等奖-完整版课件
- 运输车辆卫生安全检查记录表
- 民航概论PPT全套教学课件
评论
0/150
提交评论