微型机与应用
MICROCOMPUTER & ITS APPLICATIONS
1999年 第18卷 第1期 Vol.18 No.1 1999



超媒体系统中ODBC通用查询接口的设计与实现
宋四根　吴玲达　庄世杰
　　摘　要：开放数据库互连(ODBC)的一般工作原理和基本的体系结构，以及在超媒体系统中使用ODBC技术开发一个关系数据库通用查询接口的设计思想与实现方法。
　　关键词：超媒体　开放数据库互连ODBC　数据源　驱动程序
1　ODBC的工作原理和体系结构
　　ODBC通过驱动程序使应用程序独立于数据库管理系统。驱动程序是1个用以支持ODBC API调用的模块(通常是1个DLL)，应用程序通过调用驱动程序所支持的API函数来操纵数据库。应用程序要操作不同的数据库就要动态地链接到不同的驱动程序上。ODBC的基本结构如图1所示。

图1　ODBF的体系结构
　　ODBC将数据源映射为适当的驱动程序、网络软件、服务器名称或地址以及DBMS中的上下文。DBMS处理来自ODBC驱动程序的请求，并将结果返回给驱动程序。
　　当前关系数据库产品分2类：一类是本地型(Local)，如xBase、Foxpro等；另一类是客户/服务器型(Client/Server)，如Oracle、Sybase等。因此作为ODBC中介的驱动程序也分2类：单级驱动程序与多级驱动程序。单级驱动程序相当于本地型的DBMS，即充当了数据库引擎。多级驱动程序负责在数据库引擎和应用程序间传送命令和数据，它不进行数据处理，仅起1个中间翻译的作用，即将请求翻译成给定的数据库通信接口所能理解的形式，服务器上的数据库引擎处理并将结果返回。图2给出了应用在这2类数据库系统中的ODBC结构。

图2　2类数据库系统的ODBG结构组件
2　ODBC通用查询接口的设计与实现
　　超媒体系统是由节点(信息块)和链(块间转移)构成1个信息网，它通过节点、链机制管理和浏览网上的多媒体信息。节点可以由单一媒体窗口组成，也可以由多种类型媒体窗口组成。为了能在超媒体系统中浏览到网上众多数据库信息，我们在超媒体系统中引入了ODBC类媒体节点(暂且把各种关系数据库信息媒体统称为ODBC类媒体)，ODBC类媒体与其它类媒体如：文本、图形、图像、声音、视频、动画等媒体一样可以在超媒体系统中进行编辑和表现。
　　超媒体系统中ODBC通用查询接口的设计与实现包括2个部分：(1)ODBC通用查询系统的设计与实现，其设计与实现方法是把ODBC通用查询系统作为1个窗口类来实现，即对网上各种数据库的任意查询操作均定义在此窗口类中，暂且称该窗口类为ODBC通用查询窗口类。这里“通用查询”的意思是用户可任意选择数据库、表、列和条件等进行查询，它以1个通用查询窗口作为用户界面。(2)ODBC通用查询系统与超媒体系统的接口部分，其设计与实现方法是把ODBC类媒体窗口(ODBC通用查询窗口类的1个对象)作为1个节点，在超媒体系统中对该节点进行节点编辑、链的建立及其表现，从而实现超媒体系统与ODBC通用查询接口的无缝连接。
　　我们采用Windows 95环境下Visual C++4.2作为开发工具，使用ODBC API函数和强大的MFC类库进行编程实现。
2.1　ODBC类媒体
　　1.ODBC类媒体节点编辑
　　在超媒体系统的节点编辑窗口中提供了编辑各类媒体的工具条按钮。当用户选择ODBC类媒体编辑后，系统在节点编辑窗中弹出1对话框让用户输入ODBC类媒体属性值，输入完毕后关闭对话框，则在节点编辑窗口中生成1个ODBC类媒体窗口，即ODBC通用查询窗口，用户可移动和放大缩小窗口。编辑完后通知超媒体系统保存该ODBC通用查询窗口属性数据(如窗口的位置和大小等属性)。数据的存储和读取由超媒体系统的文档类统一负责。
　　2.ODBC类媒体节点表现
　　当用户在进行超媒体系统的表现时若鼠标触发了1条超链，而其链宿为ODBC类媒体节点，则系统读取由上面存储的ODBC通用查询窗口属性数据，并生成该ODBC通用查询窗口。此时用户可在该窗口中进行数据源的连接、表和列的选择、查询条件的任意选择、执行查询并显示查询结果等操作。
　　3.ODBC类媒体链的设计
　　链源和链宿可以是节点、媒体窗口或媒体数据片段。对于ODBC通用查询窗口没有必要把链建在ODBC通用查询窗口中的数据片断上，这里把由ODBC类单一媒体窗口组成的节点作为链源或链宿，该链的建立由超媒体系统来统一完成。
2.2　ODBC通用查询窗口类的设计
　　上述ODBC类媒体节点的编辑与表现以及链的建立是超媒体系统与ODBC通用查询系统的接口部分，利用超媒体系统的节点编辑模块、链编辑模块以及表现模块进行ODBC类媒体节点的编辑、链编辑和节点表现。把ODBC通用查询系统作为1个窗口类来实现，即对于查询网络上的各种关系数据库信息所进行的操作全部定义在1个由CWnd派生的ODBC通用查询窗口类中，在类的构造函数中通过调用Create()和ShowWindow()函数生成带有滚动条的窗口。有了ODBC通用查询窗口类后，只须在超媒体系统的节点编辑和表现模块中分别定义1个该窗口类的对象，通过给窗口构造函数传递不同的参数，并调用new操作分别生成编辑窗口和表现窗口。
　　ODBC通用查询窗口类总的设计目标是：用户通过该查询窗口能以一致的界面查询网上各种不同类型的关系数据库信息。具体应具有以下几方面功能：
　　1.一致的用户查询界面，包括用户选择数据源、表、列界面、用户交互输入查询条件的界面以及查询结果显示等界面。
　　2.对数据源、表、列、条件等用户可任意选择，包括增、删、减等操作，充分体现查询操作的通用性。
　　3.可以选择多表联合查询，可以对查询结果进行分组和排序。
　　4.用户交互选择表、列、条件等内容后系统自动在后台生成1个SQL语句进行数据库的查询。系统同时提供1个可直接写入SQL语句进行查询的接口，以便让那些对SQL语言非常熟悉的用户进行更高级的查询。
2.3　ODBC通用查询窗口类的实现
　　1个ODBC应用系统的实现大致经过以下几步：分配ODBC环境和连接句柄、与数据源连接、分配语句句柄、语句处理与检索、释放语句句柄、与数据源断开、释放连接句柄和环境。因此，根据ODBC通用查询窗口类的设计目标以及ODBC应用系统的基本结构要求，其主要的实现方法如下：
　　1.在构造函数中调用Create()函数生成1个带滚动条的窗口，该窗口用来显示查询结果。分配ODBC环境句柄，在其析构函数中释放环境句柄。
　　2.在窗口中按下鼠标左键则生成1个弹出式菜单，即在类的OnLButtonDown()成员函数中调用CreatePopupMenu()函数生成1个弹出式菜单。菜单包括：连接数据源、断开数据源、选择表、选择表连接、选择列、选择条件、选择排序/分组、SQL语句、执行查询等菜单项。
　　3.连接数据源。在该菜单项对应的函数中分配连接句柄，通过调用SQLDriverConnect()显示数据源列表让用户选择1个数据源进行连接，最后分配语句句柄。
　　4.断开数据源。在该菜单项对应的函数中释放语句句柄、与数据源断开、释放连接句柄。
　　5.选择表。在该菜单项对应的函数中通过调用SQLTables()函数查询出数据源中的所有表名，它还定义1个表选择对话框类对象并显示该对话框，在初始化对话框时把所有表名、所有者名及限定词放入对话框的对应列表控件中让用户选择要查询的表。用户选择完后将所选的表名保存到1个表串中。
　　6.选择列。在该菜单项对应的函数中通过调用SQLCols()函数查询出用户选择的表的所有列名，它定义1个列选择对话框类对象并显示该对话框，在初始化对话框时把所有列名放入对话框中列(Column)列表控件中让用户选择要查询的列。用户选择完后保存所选的列名到1个列串中。
　　7.选择条件。在该菜单项对应的函数中通过调用SQLCols()函数查询出用户上面选择的表的所有列名，它定义1个条件选择对话框类对象并显示该对话框，在初始化对话框中列的列表控件中让用户选择要输入条件的列。该对话框还包括操作符列表控件、条件值编辑控件等。用户选择完后保存所选的条件到1个条件串中。
　　对于上述用户选择表、列、条件后系统自动生成1个SQL语句，若用户修改了已选择的表、列、条件等内容，系统也自动修改已生成的SQL语句。
　　8.生成SQL语句。该菜单项显示自动生成的SQL语句对话框，用户也可在SQL语句编辑控件中修改这一SQL语句或直接输入1个新的SQL语句。
　　9.执行查询。该菜单项调用SQLExecDirect()函数执行查询并使窗口重画以显示查询结果。结果显示由窗口类的OnPaint()成员函数实现，滚动显示查询结果由OnVScroll()与OnHScroll()2个成员函数来实现。
　　上面简单介绍了窗口类中几个主要成员函数的实现方法，对于窗口类中其它一些功能成员函数的实现在这里不再一一列出。
作者单位：长沙国防科技大学七系研究生队(410073)
参考文献
　1　孟小峰译.开放数据库互连―ODBC2使用大全.北京：清华大学出版社，1995
　2　侯雪萍译.开放式数据库互连ODBC方案集粹.北京：电子工业出版社，1995
　3　王国印译.Visual C++技术内幕.北京：清华大学出版社，1996
(收稿日期：1998-06-12)
