23. 从因特网存取 Microsoft SQL Server

因特网程序设计概念
使用 ISAPI 存取 SQL Server
使用 ASP 存取 SQL Server
使用 XML 存取 SQL Server
本章总结
在 Microsoft Windows 2000 操作系统平台上使用 Microsoft SQL Server 2000,可以让我们轻易把 SQL Server 数据库「出版(publish)」到因特网上。Windows 2000 与 Microsoft Internet Information Server(IIS)5的组合提供了包罗万象的组件与接口,这些工具与 SQL Server 2000 数据库连接与互动。本章将介绍从因特网上存取 Microsoft SQL Server 的基本观念。由于本书并非讨论程序发展的专书,因此仅提供数种不同存取方式的概观。相关程序设计的细节部分,市面上有许多不错的书籍可供参考。
本章将从因特网程序设计的概念开始,并介绍 Windows 2000 中预设的因特网程序设计界面。接着会介绍 ODBC 程序设计与 ADO 的基础观念,以及存取 SQL Server 的几种方法,包括 ISAPI 与 ASP。最后我们会讨论 XML,了解何谓 XML 以及使用方式。本章涵盖许多主题,相信应有助于了解因特网程序设计的基本工具。
因特网程序设计概念
本节将学到 SQL Server 与因特网应用程序连接的基本观念。这些应用程序必须包含两个不同的接口,以执行不同的任务:一个接口用于使用者,另一个则用于 SQL Server。本节将介绍应用程序与 SQL Server 之间的连接方式,包括 IIS 与 ODBC。
以 Windows 2000 与 IIS 5 作为因特网平台
利用 Windows 2000 与 IIS 5 作为因特网应用程序的平台,可让程序开发人员淋漓尽致地存取 SQL Server 的各种功能。程序开发人员可以利用的功能包括整合数据库存取的服务器端 script 语言、开放式数据库连接(Open Database Connectivity,ODBC)数据来源、OLE DB(一套用来存取普遍性数据的强大组件对象模型(Component Object Model,COM)接口)、以及一种被称为Internet Server API(ISAPI)的 Web 应用程序架构,最后一种架构为传统 CGI(Common Gateway Interface,共同网关接口)应用程序的强大竞争对手。
使用 ODBC 数据来源
就 Microsoft Windows 平台来说,ODBC 无疑是数据库接口的最佳选择。透过 ODBC,程序开发人员可以存取的资料来源类型相当广泛,从最单纯的纯文本文件到 Microsoft Excel 数据表,甚至 Microsoft Access 及 SQL Server 数据库均可存取。ODBC 提供数据库程序设计师一个通用且功能强大的抽象层级。
发展使用 SQL Server 的因特网应用程序并不需要什么特殊的手段。要透过 Web 服务器来存取 SQL Server,ODBC 数据来源已经提供了主要的一些方法。它们可以透过被称作 ActiveX Data Objects(ADO) 的一个 OLE DB COM 对象集合来完成这类工作。ADO 提供一个对象导向接口(object-oriented-interface)来存取 ODBC 数据来源,这种方法比用 ODBC C API 来得简单。利用 ADO,程序开发人员可以初始化一些简单的对象来代表数据库联机、命令(例如 SQL 陈述式或预存程序)、以及数据录集(recordsets),其类似于客户端数据指针并且具有近乎服务器端数据库数据指针的功能性。所有的这些数据库对象与界面让我们在因特网上发展使用 SQL Server 的程序变得简单,尤其是 ODBC 中更提供了一些强大的功能,例如 联机共享(connection pooling) 。
一个以 ODBC 为基础的 Web 应用程序,如何适当地利用联机共享是最要紧的问题之一。联机共享允许一个中阶的应用程序可以维护并分享与 SQL Server 数据库的联机。共享的联机在指定的时间周期内将保持开放的状态,并可分享给数个使用者。建立联机通常是一个资源密集的作业并且造成数据库服务器的负担。由于 Web 服务器与关联的因特网应用程序操纵着绝大多数的流量,透过数据库联机共享便可将建立联机以及(尤其是)重建联机的情况降至最低。如此一来,使用者联机时间可以更快,也降低了数据库服务器的资源消耗。在预设的状况下,IIS 5.0 会动态地分配数据库联机共享。
________________________________________
说明
当使用 ODBC 数据来源与 ADO 时,应以每一分页为基础使用 ADO 联机对象。相较于使用整个工作阶段对象,若在分页需要时才建立联机对象,并在不需要时立即释放它,数据库联机可更快地释放回共享状态以便其它联机使用。如此可大大地降低因特网应用程序使用者等待联机的时间。
________________________________________
选择网络链接库
虽然 SQL Server 可以支持命名管道及 Banyan Vines 等数种不同的网络链接库,但当您在因特网上部署一个 SQL Server 数据库时仍应使用 TCP/IP 网络链接库。在 SQL Server 网络链接库的众多选择中,TCP/IP 能提供绝佳的网络适应性,联机速度与效能。(网络链接库已在 第 11 章 解释。)
若使用 TCP/IP 作为网络链接库,SQL Server 安全性模式会被限制在只能使用标准安全性。这种模式使用 SQL Server 登入来验证。TCP/IP 并不支持整合式安全性,其使用 Windows 2000 账户来加以验证,能提供较佳的安全性以及较有效率的方法来维护 SQL Server 系统主控台里账户的集中管理。不过,使用整合式安全性相对在某些层面上也会恶化系统的效能。
首先,若使用整合式安全性,ODBC联机共享的效力就会严重受限。采取整合式安全性时,每个透过Web服务器验证进入数据库服务器的使用者必须使用唯一的登入。如此一来,联机共享所能提供的益处全然无效,因为共享的联机会被拒绝,要联机就必须使用与现存联机相同的登入与密码。
其次,以命名管道网络链接库为基础的联机多半与整合式安全性一起使用,这种联机一般说来会较为缓慢。使用命名管道还会造成联机共享的一些问题。您可以将匿名账户对应到一个有效的 SQL Server 登入,借着这个方法在命名管道连接中使用联机共享,不过多数 Web 服务器会采取挑战与响应验证模式或基本验证模式以强制单独联机至 SQL Server。结果就是否定了联机共享可提供的任何效能改善。
如果 SQL Server 与 Web 服务器是分装在不同的机器上,使用整合式安全性也会对验证模式的选择有所限制。挑战与响应验证模式将无法使用,能选择的只有基本验证模式与匿名验证模式。在因特网上让一个安全系统允许匿名验证绝不是明智的做法,而基本验证,一如刚刚所说的,则会让联机共享无法发挥。
使用 ISAPI 存取 SQL Server
ISAPI 是一组函式呼叫的集合,这些函式呼叫是设计来提供给因特网应用程序开发人员一个可以延伸 IIS 机能的强大工具。ISAPI 应用程序能提供卓越的效能与低阶的控制。事实上,ISAPI 应用程序在 IIS 上会比其它的 Web 应用程序来得更有效率。此外,透过 ISAPI,程序开发人员可以应用 Win32 API 的所有功能。
ISAPI 应用程序的动态链接库(DLL)有两种类别:扩充程序(extension)和筛选器(filter)。由于 DDL 是典型的编译过的程序代码,执行的速度比直译的程序代码或 script 语言要快很多。如果您的因特网应用程序在执行速度与延展性上要求很高,那么即使在程序设计与修改上会花点功夫,ISAPI 扩充程序与筛选器仍是最佳的选择。接下来的几节里我们会详细介绍 ISAPI 扩充程序与筛选器,然后解释一下 ISAPI 应用程序的设计与使用上的限制。
ISAPI 扩充程序
ISAPI 扩充程序的执行方式与 DLL 相同,它们会被加载到 IIS 处理空间或是与其分开的另外一个处理空间。当您在 Web 服务器上安装 ISAPI 扩充程序时可以选择加载的方式。如果应用程序不太稳定,扩充程序应该被加载到分开的处理空间,以避免一个错误的 ISAPI 扩充程序毁了整个 Web 服务器。如果 ISAPI 扩充程序还在试验阶段或是尚未完整测试,这种事是有可能发生的。
要呼叫一个 ISAPI 扩充程序,可利用 URL 中.dll的虚拟路径,例如: 。
当我们利用这种方式呼叫 ISAPI 扩充程序后,如果它尚未被加载,则此 ISAPI 扩充程序会被加载到内存中,并掌控整个要求,而 IIS 就变成服务器与客户端浏览器之间一个单纯传送数据的媒介。这种应用的一个例子是因特网站台上的自订搜寻引擎。
ISAPI 筛选器
ISAPI 筛选器的执行方式也与 DLL 相同,不过它们在 Web 服务器启动时便加载到 IIS 处理空间,并且保留在内存中直到服务器停止。ISAPI 筛选器可以设定来接收任何数量的筛选器事件通知,这些通知讯息在 IIS 处理每个 HTTP 要求及产生 HTTP 响应时都会出现。当一个 ISAPI 筛选器被加载后,筛选器会与 IIS 通讯,应该要通知筛选器的事件便会透过一种特殊的结构来传输。每当有类似的事件发生时,对该事件注册(registered)为应通知的筛选器便会收到一个事件通知讯息。
ISAPI 是一个功能相当强大的工具,可用来执行压缩或加密,自订的验证,Web 流量日志与分析,甚至服务器端 scripting engine。您可以建立一个 ISAPI 筛选器检查每个传送至客户端的 Web 网页设定,搜寻特殊的标签,并修改它们使其拥有一致的外观,就如同一个 ASP 网页所做的一样。
ISAPI 筛选器能够检查每个进来与出去的数据流,这种能力使它成为一个好用且很有弹性的工具。不过,如果使用太多的 ISAPI 筛选器,整个网站的效能与延展性就会彻底降低。举例来说,如果每个单一的输入与输出网页都需要筛选,就有可能因筛选器的过度活动而造成系统严重的负担。当您在决定筛选器要执行的工作时,应特别注意的是如何将其工作最小化。例如,在一个自订的加密结构里,筛选器应该只有在 IIS 需要从客户端读取数据或将数据写入到客户端时才执行加密。如此便可减少 ISAPI 筛选器应完成的工作数量。
ISAPI 的限制
ISAPI 技术虽然可以提供最佳的有效效能,但它也有一些缺点。由于写作 ISAPI 扩充程序与筛选器大多利用 C 或 C++,因此开发 ISAPI 扩充程序与筛选器会比开发 script 网页来得耗时,维护也会比较困难。当 ISAPI 扩充程序与筛选器需要修改时,整个应用程序都需要重新编译,而不只是替换档案。再者,即使 ISAPI 扩充程序与筛选器的执行速度一般说来会比与其功用类似的服务器端 script 程序来得快,但它们无法保证能提供最理想的延展性。最后,某些程序设计抽象过程(大部分服务器端 script 程序开发人员都认为该有的),特别是 session 对象,令人惊讶的是在 ISAPI 程序设计中竟然没有。比起服务器端 script 的程序设计,ISAPI 程序设计可说是相当低阶。
使用 ASP 存取 SQL Server
ASP 是一个服务器端 script 环境,程序开发人员可以利用它来建立互动的、动态的网页,进而发展出功能强大的 Web 应用程序。一个 ASP 档案是一个扩展名为 .asp 的纯文本文件,里面可包含任何文字组合、HTML 卷标、以及服务器端 script。虽然 ASP 纯粹执行于服务器端,程序开发人员仍然可以在他们的 HTML 码中包含客户端 script,并且透过用户的浏览器来执行而不是透过 Web 服务器来处理。
当 Web 服务器接收到一个对 ASP 档案的要求,Web 服务器会执行档案中包含在特殊标签内的服务器端 sript 并建立一个网页。产出的结果是纯粹的 HTML 档案,其中可包含刚刚提到的客户端 sript 组件。这个档案接着被传送到客户端的浏览器,浏览器再将这些组件执行或表现在屏幕上。不会有任何 ASP 原始码被传送到客户端。它们的分析与执行全都在服务器上完成。使用者并不会见到建立网页的 script 命令,他们看到的是这些命令建立出来的东西。
除了包含服务器端 script,ASP 档案也可以包含对 COM 组件的呼叫,以执行许多不同的任务,包括数据库存取。此外,也可执行横跨数种不同发展环境的商业逻辑对象。
ASP 在语言采用上相当中立。程序开发人员可以利用他们熟悉的 script 语言,如 Microsoft Visual Basic Scripting Edition(VBScript)、Microsoft JScript 或 Perl,来开发 ASP 档案,而发现到开发过程并不困难。ASP 网页可以使用已安装在 Web 服务器中并与 COM 兼容的 scripting engine 支持的 script 语言。 scripting engine 是一种程序,可用来处理以特定语言写成的命令。IIS 包括的 scripting engine 支持常用的 VBScript(以 Visual Basic 为基础)及 JScript(欧洲计算机制造商协会(European Computer Manufacturers Association,ECMA)262 语言规格的 Microsoft 版本)语言。从协力厂商那里可以取得像是 Perl 这类语言的 scripting engine。
ASP 具有一些超越传统 CGI 应用程序的优点。之前已经提到,对 VBScript 或 JScript 已经相当熟悉的程序开发人员将不需要学习新的程序语言,像是 C 或 Perl。ASP 提供了一些针对使用者工作阶段,要求及响应处理的对象,这使得 ASP 的功能更为强大,并且让个人化的内容开发更为容易。此外,比起利用 C 语言开发并编译的 CGI 应用程序,ASP 仅需极少的时间与程序代码便可处理与收集 HTML 窗体信息,并将其储存在数据库里。由于所有的 ASP 程序代码都是内嵌于 HTML 文件中,因此 ASP 的维护也相当容易。
使用 XML 存取 SQL Server
XML 是 Extensible Markup Language (延伸标记语言)的缩写,但 XML 实际上并不是一种语言。它其实是一种系统,可用来定义其它的语言,以及表达数据结构的通用语法。不同于仅仅用来指明 Web 文件呈现方式的 HTML 标记语言,XML 指定了文件的内容与结构。所谓 结构化数据(structured data) ,指的是依其内容或使用方式标记起来的数据。
XML 天生具有可延伸的特性。程序开发人员利用 XML 来定义 Web 网页内的数据,并依其需求限定细节的层级。举例来说,程序开发人员可使用 <AUTHOR> 或 <TITLE> 标签来描述书籍与出版的相关信息。如果需要额外的定义,程序开发人员可以增加 <RETAILPRICE>、<PUBLISHER>,或甚至 <ISBN> 标签。使用 XML 类似于在数据库中建立一份数据表,它必须决定应用程序需要的数据元素,就彷佛决定需要哪些数据行才能完整地描述数据表中的数据列。
由于 XML 并不描述呈现方式,因此一个 XML 文件只要写作一次便可使用不同的装置以各种方式来显示,包括 Web 浏览器、行动电话、汽车的车用显示器等等。这些装置可能有各自的显示需求:计算机屏幕也许是 800×600 像素,而一个无线的因特网装置却可能只支持 200×200 像素。由于 XML 仅定义了文件的结构与内容,这些装置只要利用各自整合的 XML 浏览器,便可将文件依其特定的显示需求呈现出来。不同于 HTML 文件,XML 文件在编写后可以用得更为长久,不会因为新的显示技术而很快被淘汰。
XML 真正有用的地方在于它可以利用 文件对象模型(Document Object Model,DOM) 来产生互动的功能。DOM 是一个接口,用来定义存取文件中数据的机制。使用 DOM,程序开发人员可以利用标准化的方式撰写动态的内容。举例来说,程序开发人员可以使用 DOM 让内容某一特定部分在一些情况下产生行为。使用这种方法可以让文件增加一些效果,例如可以让文字的某一部份-比方说,一个在 XML 中已被称为 <TITLE> 的卷标标记起来的书名-在使用者的鼠标光标滑过时会改变颜色,表示说这是一个指向某一家在线书店的超级链接。要利用目前专门的 DOM 与样式表规格来达成这类效果并不容易,不过由 W3C 制定的新的 DOM 标准将可帮助 XML 程序开发人员维护真正的平台独立。
XML 也很快地成为交换数据与文件的标准。XML 可用来在因特网上相异的数据库系统之间交换数据。举例来说,一家汽车零件供货商可利用 XML 与汽车制造商交换存货数据,即使这两家厂商可能是在两种不同的平台上使用两种完全不同的数据库系统。由于 XML 描述了数据结构的方式,因此它可以毫无问题地成为将两种既不相同也不兼容的系统之间的桥梁。
本章总结
在本章中,您已学习到在 Windows 2000 操作系统平台上利用 SQL Server 与 IIS 5 来开发因特网应用程序的相关基础。可用来开发应用程序的选择相当多,包括像是 ASP 这类 script 环境,或是如 ISAPI 扩充程序与筛选器这类编译程序代码,每种选择都有其各自的优点与缺点。当您在选择一个工具开发您的大型因特网应用程序,应特别注意每一种选择的交易限制以避免日后发生问题。