丁保国的博客

收集整理工作生活,点点滴滴

  :: :: 博问 :: 闪存 :: :: :: :: 管理 ::

第1章             使用SQL Server

1.1             文件型数据库与C/S型数据库

 

数据库编程是Delphi最强大的优势之一, Delphi独特的数据感知(Data-Aware)构件,让很多初识Delphi的人为之目瞪口呆。不需要写任何代码,在几分钟之内就可以做出一个相当精巧的数据库程序,而且在开发期就可以看到运行期的结果,简直有点令人不可思议!但是,Delphi强大无比的数据库开发能力,决不仅仅限于用几个构件操纵一下DBF或是Access数据库而已。你所看到只是冰山一角。让我们仔细说来。

数据库虽然家族庞大,但一般来说可以分为两种:文件型数据库和C/S型数据库。下面分别讨论。

1、文件型数据库

所谓文件型数据库,顾名思义,是基于文件的(file-based),数据被按照一定格式储存在磁盘里,使用时由应用程序通过相应的驱动程序甚至直接对数据文件进行读取。也就是说,这种数据库的访问方式是被动式的,只要了解其文件格式,任何程序都可以直接读取,这样就使得它的安全性相当糟糕。同时,在蓬勃兴起的网络应用,文件型数据库更是难有用武之地:效率低下,不支持很多SQL命令,不支持视图、触发器、存储过程等高级功能,等等。这些特点决定了它不适合大型的工程。

 

 

 

81  文件型数据库应用程序结构

 

虽然我们可以对文件型数据库直接读取,但实际编程中很少有人这么做。因为再简单的数据库其实也是相当复杂的,一步步分析它的格式,从底层实现所有的数据库应用,如果都要程序员去写的话,可能会把人累死。所以数据库的开发商将这些访问代码封装起来,向程序员开放,程序员只需要调用相应的接口就可以了。

到目前为止一直使用的Access数据库就是一种文件型数据库。AccessMS Office系列应用程序中的一个桌面型数据库管理系统。和DBase系列中的DBF数据库不同,Access数据库将所有的文件都整合在一个.mdb文件中,这样就避免了数据库变大之后管理上带来的麻烦。同时它还提供密码保护功能,安全性比DBF数据库要好很多。Access数据库除了一般的文本数据之外,还擅长于对多媒体数据的处理,在对声音、图像乃至基于OLE的对象进行处理时,令DBF数据库望尘莫及。随着微软战略的步步胜利,Access数据库也不断发展,凭借着优秀的性能和与MS Office中其它应用程序(如:WordExcel PowerPoint等)的无缝结合,早已超越DBase系列,成为现今最强大的文件型数据库了。

文件型数据库应用系统中, 通常数据库与应用程序位于同一台机器上,但也可以将数据库放在另一台机器上,供多个应用程序使用。

 

 

 

82  多个应用程序使用同一个数据库

 

2、C/S型数据库

C/SClient/Server,客户机/服务器)型数据库是当前数据库应用的主流。

与文件型数据库不同的是,C/S型数据库应用程序由两个部分组成:服务器和客户机。服务器指数据库管理系统(Database Manage SystemDBMS),用于描述、管理和维护数据库的程序系统,是数据库系统核心组成部分,对数据库进行统一的管理和控制。客户机则将各种请求送交到服务器,服务器则将结果返回给客户机。

 

 

83  C/S型数据库应用程序结构

 

与文件型数据库系统不同,C/S型数据库系统的特点是:客户机与服务器相互配合,客户机发送请求,服务器将请求结果返回给客户机。客户机并不直接操作数据库。

例如:客户端通过ADOQuery构件发送一条SelectSQL命令来查询数据库中所有来自“台北市”的员工记录,服务器接收到该命令立即执行,然后将执行结果(记录集)返回给客户端。

而对于文件型数据库,同样执行这个查询,应用程序会通过网络从存放数据库文件的机器上将整个文件读取过来,然后在客户端执行查询。(当然,如果应用程序与数据库文件放在同一台机器上时,则不需要通过网络来读取数据库文件,这就是所谓的单机版数据库应用系统)。

C/S型数据库非常适合于网络应用,可以同时被多个用户所访问,并赋予不同的用户以不同的安全权限。

C/S型数据库支持的数据量一般比文件型数据库大得多,还支持分布式的数据库(即同一数据库的数据库位于多台服务器上)。同时,C/S型数据库一般都能完善地支持SQL语言(所以也被称作SQL数据库)。 这些特性决定了C/S型数据库适合于高端应用。

常见的C/S型数据库有著名的Oracle SybaseInformix、微软的 Microsoft SQL server, IBMDB2,以及Delphi自带的InterBase等等。

SQL Server 是一个关系数据库管理系统它最初是由Microsoft Sybase Ashton-Tate三家公司共同开发的于1988 年推出了第一个OS/2 版本在Windows NT 推出后MicrosoftSybase SQL Server 的开发上就分道扬镳了Microsoft SQL Server 移植到Windows NT系统上专注于开发推广SQL Server Windows NT 版本Sybase 则较专注于SQL ServerUNIX 操作系统上的应用在本书中介绍的是Microsoft SQL Server 以后简称为SQL ServerMS SQL ServerSQL Server 2000 Microsoft 公司推出的SQL Server 数据库管理系统的最新版本该版本继承了SQL Server 7.0 版本的优点同时又比它增加了许多更先进的功能具有使用方便可伸缩性好与相关软件集成程度高等优点可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Microsoft Windows 2000 的大型多处理器的服务器等多种平台使用。

SQL Server 2000 全面扩展了SQL Server 7.0 的性能可靠性和易用性使它成为一个杰出的数据库平台可用于大型联机事务处理数据仓库以及电子商务等。

 

1.2             Delphi访问SQL Server2000数据库

比起连接Access数据库来说,要登录SQL Server并连接其中数据库的步骤相对麻烦一些,因为登录SQL Server时,必须提供用户的帐号与密码,如果输入的帐号与密码有误,那么SQL Server将会拒绝我们的登录操作,同时,在输入登录帐号与密码后,还必须指定要连接的数据库的名称。

现以ADOConnection组件来登录SQL Server2000并连接FPNWind数据库为例,来演示操作过程:

1)、在窗体中加入ADOConnection组件,选取ConnectionString属性进行连接设置,如 84所示。

 

84  ConnectionString属性设置

 

2)、单击图?中连接字符串编辑窗口的Build按钮,将出现“数据链接属性”对话框。因为我们的数据来源提供者是SQL Server,所以必须将数据库驱动程序选定为Microsoft OLE DB Provider for SQL Server,如 85所示。

 

85  选取数据库驱动程序

 

3)、单击“数据链接属性”对话框中的“下一步”按钮,操作焦点转到“连接”选项卡,在“连接”选项卡中我们要做:

u       输入服务器名称:输入安装SQL Server时所指定的服务器名称(单机环境下可以不输入服务器名称,但如果是多用户网络环境下则必需输入!)

u       输入用户名与密码:如果您没有在SQL Server上建立相关的用户帐号、密码,则可以直接输入用户名sa,密码为空。

u       选取数据库:如果上述两个步骤中所输入的数据无误,则我们就可以选取SQL Server内的数据库,作为连接的目标,如 86所示。

 

86  登录SQL Server与连接数据库设置

 

4)、单击“测试连接”按钮,如果测试成功,就表示我们已经可以顺利地登录SQL Server并连接数据库。执行结果如所示。

 

87  执行结果

 

 

 

 

注意

 

 


如果无法选取SQL Server内的数据库,最大的可能是SQL Server尚未启动,请务必在登录与连接前先启动SQL Server

 

 

 

1.3             执行数据库中的存储过程

1.3.1          为什么要使用存储过程

1、什么是存储过程:

当我们开发一个大型的应用程序时,为了便于修改与扩充,经常会将各个负责不同功能的命令语句集中,依用途分别独立放置,以便能够反复调用。而这些独立放置且持有不同功能的命令语句,就称为“过程”(Procedure)。

Microsoft SQL Server 2000的存储过程与其它程序设计语言中的过程非常相似,只不过存储过程是包含TransactSQL命令语句并以特定的名称保存在数据库中(作为数据库中的一个对象)的。我们可以在存储过程中声明变量、使用条件、循环等流程控制语句及其它程序设计功能。这意味着,我们可以通过存储过程来完成一些例行且复杂的操作。

SQL Server的存储过程与其它程序设计语言中的过程类似,能够:

(1)、包含运行各项数据库操作的命令语句,并且可以调用其它的存储过程。

(2)、接受输入参数并以输出参数的形式返回多个数据给调用它的程序。

(3)、返回一个状态值给调用程序或批处理,来表示调用成功或失败以及失败的原因。

 

2、使用存储过程的好处:

(1)、实现模块化的程序设计

存储过程一旦创建并保存于数据库中后,就可以在你的程序中反复调用,因此利用存储过程来完成某些经常性的操作是最恰当不过的了。

(2)、更快的运行速度

存储过程在第一次运行时,SQL Server会先进行编译与优化,并常驻于内存中,因此以后再次调用时不需要再从磁盘中加载。而如果是从前台传送SQL命令语句到后台的SQL Server,则每次运行时都要重新编译与优化,速度显然较慢。

(3)、有效降低网络流量

假设某一项操作需要数百行的SQL语句来完成,如果你是从前台将这数百行语句传送到后台的SQL Server来执行,则在网络上传输的是组成这百行语句的几千或几万个字符;而如果你事先将这百行语句编写成一个保存在SQL Server数据库中的存储过程,则你只要在前台发送一条执行此存储过程的命令就行了,网络上传输的只是组成这条命令的几十个字符。

(4)、较好的安全机制

例如,如果你不希望某用户直接去访问数据库中的某个表,但又必须要求他针对这个表执行某个特定的操作。要实现此目的,你可以将该用户所能针对数据表运行的操作编写成一个存储过程,并赋予他运行此存储过程的权限,这样一来,虽然该用户没有权限直接访问数据表,但仍然能通过运行存储过程来完成所需的操作。

 

1.3.2          怎样创建存储过程

创建存储过程,可以用以下几种方法:

(1)、利用“企业管理器”

(2)、利用“查询分析器”

(3)、使用其它的文本编辑工具,如:记事本、写字板、Microsoft Word 等。(如果是使用写字板、Microsoft Word ,则必须保存为纯文本格式的文件!)

 

1.3.3          怎样在Delphi中执行存储过程

返回数据集

不返回数据集

 

 

 

按照存储过程调用后的结果,可分为两类:

 

 

对于返回数据集的存储过程,可以使用前面所介绍的ADODataSet组件;而对于不返回数据集的存储过程,则可以使用ADOCommand组件。

另外,Delphi还提供了一个专门用于调用存储过程的组件ADOStoredProc,无论存储过程是否返回数据集,均可使用该组件来调用。具体见下表:

 

 

存储过程是数据库内独立的子程序,所以在调用时,有时可能需要传递参数值给存储过程,例如:我们要调用Northwind数据库中的CustOrderHist存储过程,就必须传递一个@ CustomerID的参数值(见下面存储过程):

 

Delphi把参数值的传递封装成了ADOStoredProc组件的Parameters属性,在我们程序静态设置阶段就可以利用Parameters属性指定调用过程时必须指定传递的参数值。

现在就让我们以实例来看看如何调用存储过程:

1)、在Delphi中新建一个项目

2)、在窗体中布置一个ADOConnection组件,并连接SQL Server内的Northwind数据库。

3)、在窗体中加入ADOStoredProc组件,用以调用Northwind数据库中的CustOrderHist存储过程。

4)、将ADOStoredProc组件的Connection属性指定为步骤(2)中的ADOConnection组件。

5)、单击ADOStoredProc组件的Procedure属性,从列表选项中选取CustOrderHist存储过程。

 

88  指定要执行的存储过程名称

6)、单击ADOStoredProc组件的Parameters属性栏右方的对话框,此时将会出现Parameters属性编辑对话框,此时您会在对话框中看到ADOStoredProc组件已经取得CustOrderHist存储过程的参数与参数类型。

 

89  设置Parameters属性

 

7)、选取@ CustomerID参数项目,我们就可以直接指定调用CustOrderHist存储过程时的@ CustomerID参数值(Value属性),本例中填入:VINET,如 810所示:

 

810  指定传递给存储过程的参数值

 

8)、在Button1OnClick事件中添加如下事件处理程序:

 

ADOStoredProc1.Active:=true;

 

然后运行程序,单击Button1,就可以看到运行结果:

 

811  存储过程执行结果

对于那些能够返回结果集的存储过程(如本例中的这个存储过程,就是一个返回查询结果集的查询),可以通过将ADOStoredProc1Active属性置为True来执行存储过程;而对于不返回结果集的存储过程,则必须通过调用ADOStoredProc组件的ExecProc方法来执行。如:

 

ADOStoredProc1.ExecProc;

 

 

 

注意

 

 


传递给存储过程的参数,通常是在程序中动态赋值,而不是在设计时指定。

posted on 2007-07-21 15:27  丁保国  阅读(436)  评论(0编辑  收藏  举报