发信人: atong (sut), 信区: BorlandDev
标  题: 深入delphi编程(转6)
发信站: 哈工大紫丁香 (Wed Jul  3 20:05:50 2002) , 转信


  2.2 c/s型数据库
  c/s(client/server,客户机/服务器)型数据库是当前数据库应用的主流。
  与文件型数据库不同的是,c/s型数据库应用程序由两个部分组成:服务器和客户机。
服务器指数据库管理系统(database manage system,dbms),用于描述、管理和维护数
据库的程序系统,是数据库系统核心组成部分,对数据库进行统一的管理和控制。客户机
则将用户的需求送交到服务器,再从服务器返回数据给用户。
  c/s型数据库非常适合于网络应用,可以同时被多个用户所访问,并赋予不同的用户以
不同的安全权限。c/s型数据库支持的数据量一般比文件型数据库大得多,还支持分布式的
数据库(即同一数据库的数据库位于多台服务器上)。同时,c/s型数据库一般都能完善地
支持sql语言(所以也被称作sql数据库)。这些特性决定了c/s型数据库适合于高端应用。

  常见的c/s型数据库有著名的oracle, sybase, informix, 微软的microsoft sql
  server, iem的db2,以及delphi自带的interbase,等等。
  c/s型数据库涉及到非常多的高级特性,是delphi中,也是整个计算机领域中最大的应
用之一。由于本期附录中已有专文讨论,本文就不拟详细介绍了。
  随着技术的不断更新,c/s型的结构也开始逐渐被多层(multi-tiered)数据库模型所
取代。
  上面说到,c/s型数据库程序由服务器和客户机两个部分组成,因此被称为双层(two
-tiered)模型。文件型数据库程序则被称为单层(single-tiered)模型。单层模型是最
原始的数据库模型。后来程序员们将数据库转移到一个强大的中央服务器上,让它为多个
功能较弱的客户机提供服务,这样双层模型出现了。双层模型在金融、电力、通信等领域
被广泛使用,极大地推动了网络数据库的发展。但是,双层模型也逐渐暴露出其不足的一
面。在这种情况下,出现了三层模型:应用程序中的数据模块部分被分离出来,转移到一
个单独的服务器上,成为独立的一层。三层和三层以上的模型,统称为多层模型。
  ` 简言之,三层模型由以下三个层次组成:
  
  客户机-应用程序服务器-数据库服务器
  
  用户的请求首先通过客户机向应用程序服务器发出,应用程序服务器再向数据库服务
器发出具体的数据访问命令(一般是sql),数据库服务器返回的数据被应用程序服务器重
新组织之后返回给客户机。
  可以看出,三层模型是双层模型的扩展。目前我们无需了解三层模型的所有技术细节
,以及它对于双层模型的优势,只需要大致理解这个模型的结构就可以了。
  b/s模型无疑是当前最为流行的多层数据库模型之一。也许你已经听说过b/s这个名词
,它是brower/server(浏览器/服务器)的缩写。brower是指ie/netscape这样的浏览器,
server包括数据库服务器和应用程序服务器。用户通过浏览器发出某个请求,通过应用程
序服务器-数据库服务器之间一系列复杂的操作之后,返回相应的html页面给浏览器。
  是不是觉得十分熟悉?对了,其实这就是大家再熟悉不过的internet上的web数据库,
当然它也可以用于局域网。它实际上可以说是一种最常见的多层模型。
  在对数据库的发展进行回顾之后,我们终于赶上了最流行的步伐。但是,也许有人在
这里却感到泄气了。因为他听说现在的web数据库编程,是perl、asp、php、java这些语言
的天下。难道我们一直忠实追随的delphi,在面对当代最流行的web数据库的时候,竟然面
临淘汰的命运?
  不,不是的。其实delphi对web数据库的开发提供了非常良好的支持,特别是依据强大
的数据库支持和可视化编视的特点,它有着其他语言不可比拟的优势。
  下面的内容将集中于用delphi开发web数据库。
  首先要从web本身讲起。平时我们浏览的web页面,一般可以分为两种。一种是静态页
面,这种页面是文本格式的html文件。但是,要响应用户的不同需求,从而反馈给用户不
同的页面,就必须使用动态页面技术了。例如,根据用户输入的名字,迅速在数据库中查
找到相应的数据,并动态生成一个页面返回给用户。
  怎样实现动态页面技术呢?最早的一种方法是cgi(common gateway interface,通用
网关接口)。这种接口允许浏览器发送和接收数据,并且基于应用程序的命令行进行输入
和输出。当浏览器发出指向应用程序的请求时,web服务器会自动启动该程序,并在浏览器
和应用程序之间传递输入和输出的数据。实现cgi的语言有很多种,其中比较流行的是per
l。另外,还有一种特殊的wincgi。wincgi与普通cgi的区别是,它通过ini文件来代替命令
行参数作为输入输出,这主要是为visual basic设计的,因为vb不能访问环境变量。delp
hi对这两种cgi都提供了很好的支持,可以编写出非常复杂的cgi程序。
  第二种方法是使用web服务器内置的api接口。用这种接口编写出来的dll文件,被web
服务器装载到自己的内存空间中,当服务器接收到相应的页面请求时,它将启动一个新的
线程来执行dll中的相应代码。由于不需要执行外部的exe文件,这种程序的速度非常快。
这种api主要有isapi(internet server api)和nsapi(netscape server api),其中前
者已经成为事实上的标准。delphi对这两种api也提供了很好的支持。提得一提的是,del
phi的c/s版提供了一个通用的类框架,消除了cgi、wincgi和isapi之间的区别,这样,我
们可以轻松地将一个应用程序在这三者之间转换。
  还有一种是web服务器内置的脚本语言,可以被简单地嵌入html文件,通过web服务器
的解释执行来产生动态页面。著名的asp、php、jsp都属于此类。这看起来和delphi没有什
么关系,但事实上,delphi也能提供对asp的强力支持!asp的初学者可能会把注意力都集
中在它的脚本语言上,其实asp是由三部分组成的:脚本、组件和html。光是掌握脚本和a
sp原有的组件特性是远远不够的,只有自行开发组件,才能实现真正复杂、高效的应用。
delphi就非常适合开发这种组件。国内著名大富翁论坛,就是基于delphi+asp的成功例子
,同时它还公布了所有的源代码,可供借鉴。
  让我们先建立一个程序。这个程序和以往的delphi不同,要求删除所有的窗体和多余
的代码,最后只剩下这么一段:
  
  program cgidate;
  
  {$apptype console} //这行编译器指令表示这是一个控制台程序,不需要窗体,在终
端窗口中输出
  
  uses
  sysutils;
  
  begin
  writeln('http/1.0 200 ok');
  writeln('content-type: text/html');
  writeln;
  writeln('<html> <head>');
  writeln(' <title>time</title>');
  writeln('</head><body>');
  writeln('<h1>time at this site</h1>');
  writeln('<hr>');
  writeln('<h3>');
  writeln(formatdatatime('"today is " dddd,mmmm d,yyyy,' + '"<br> and the ti
me is "hh:mm:ss am/pm',now));
  writeln('<h3>');
  writeln('<hr>');
  writeln('</body></html>');
  end;
  
  编译后,将该程序置于web服务器下的有scripts权限的子目录中,并用浏览器访问它
,就可以得到一个关于当前时间和日期的页面。
  分析一下这段代码。格式很简单,都是用writeln生成标准输出。首先的两行生成htm
l的描述,中间空一行,接下来的代码生成了一个完整的html文件。这个文件被返回给浏览
器并显示出来。与静态页面不同是,有一行html文本是通过formatdatatime函数动态生成
的,因此根据当前时间的不同会有不同的显示。
  这就是一个最简单的cgi程序。虽然简单,但已经可以看出cgi程序的基本工作原理:
通过标准输入输出产生动态的html页面。
  在这个基础之上,可以方便地实现对数据库的访问,并生成相应的html。
  下面是一个例子:
  
  var:
  table1:ttable;
  begin
  showheader; // showheader过程生成html文件的头部,代码与上例相似
  table1 := ttable.create(nil);
  try
  table1.databasename := 'dbdemos';
  table1.tablename := 'employee.db';
  table1.indexname := 'byname';
  table1.open;
  showtabindex; //显示表中的列
  finally
  table1.close;
  table1.free;
  end;
  writeln('</body></html>');
  end;
  
  这段代码动态建立了一个table对象,并将它与dbdemos数据库中的表employee.db相连
(当然这些必须先在bde中设置)。showtabindex过程显示了该表中的两个列:
  
  procedure showtabindex;
  begin
  table1.frist;
  writeln('<ul>');
  while not table1.eof do
  begin
  writeln(format('<li>s%s%',[table1.fieldbyname('firstname').asstring, table
1.fieldbyname('lastname').asstring]);
  table1.next;
  end;
  writeln('</ul>');
  end;
  
  showtabindex函数遍历了整个表,并将所有的firstname和lastname字段打印出来。
  在此基础之上,可以产生复杂的动态页面,实现对数据库的各种操作。当然,实践中
的问题决不仅仅这么简单,例如,读取有关的环境变量,要使用特殊的getenvironmentva
riable变量,生成相应的url,需要相应的http知识,产生供用户提交请求的页面,需要了
解html表单的格式……但是,本文的目的不在于探讨技术细节,而是着重于基本概念和原
理的了解,因此不再详述,请读者自己深入学习。
  上面已经说过,在delphi中可以轻松地将一个应用程序在cgi、wincgi和isapi之间转
换。上面这两个例子生成的是exe文件,因此是cgi(或wincgi,取决于使用环境变量还是
ini文件)程序。如果要改成isapi方式,除了要编译成dll文件之外,输入输出的部分也需
要进行修改,实现三个特殊的函数:
  getextensionversion
  terminateextension
  httpextensionproc
  web服务器在装载dll、卸载dll和请求dll时会分别调用这三个函数,程序可以通过它
们与浏览器进行交互。具体的实现,这里也不详述了。
  
  
  通过以上几个专题的学习,相信读者对delphi的了解更深了一层。本文旨在帮助读者
理解一些相对比较高级的概念和原理,很多地方只是介绍了最基础的东西,没有展开。如
果深入下去,将会产生很多章庞大的内容。因此,读者在入门之后,需要更多的自己的努
力。
  
  下面是作者推荐的一些资料:
  书籍:
  《delphi5从入门到精通》,marco cantu著,电子工业出版社。在delphi世界中,ma
rco cantu作为书籍作者可说是人人皆知,delphi从入门到精通系列更是绝对的经典。这本
书虽然并不面向高端用户,但它全面地论述了delphi编程中的各个方面,象组件开发、多
线程、图象处理、报表打印 、i/o、数据库、internet应用等等,是亟待提高的初学者的
不二之选 。
  《delphi4编程技术内幕》,charlie calvert著,机械工业出版社。作者是一位经验
极其丰富的高级程序员,用深入浅出的语言,将delphi中的许多复杂问题一一道来,令人
豁然开朗。丰富的内容和独特的风格让这本书的读者不但有技术上的收获,而且有阅读上
的快乐。很多人吐血推荐的东东,高手案头必备之物。
  《delphi3开发使用手册》,机械工业出版社。由delphi的内部开发人员所著,权威性
可见一斑。虽然它的可读性并不是很好,但其全面、深入、权威的介绍,使得本书可以当
作delphi的使用手册来读。哪怕在delphi5已经发布的今天,这本书仍然有其不可替代的位
置。
  网络资源:
  大富翁论坛(http://www.delphibbs.com/),国内最著名的delphi技术论坛,几乎所
有的国产delphi高手都聚集在那里,代表着中国大陆delphi世界的最高水平。练功场上有
大量公开的程序源码和编程资料,丰富实用的论坛离线数据库更是每个delphi程序员的必
备。
  深度历险(http://www.vclxx.com),最大的中文delphi控件下载中心,更新迅速,
本文中提到的一些控件可在此下载。
  无双谱(http://onekey.yeah.net),作者的个人主页,本文中提到的一些程序源码
与控件可在此下载。

















--

※ 来源:.哈工大紫丁香 http://bbs.hit.edu.cn [FROM: 202.118.239.3]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.287毫秒