当前位置: 首页 > 文档资料 > Delphi 基础教程 >

第十八章 Delphi客户服务器应用开发(三)

优质
小牛编辑
128浏览
2023-12-01
第十八章 Delphi客户服务器应用开发(三)

3. 安装的软件项目

当你安装InterBase SQL Link驱动程序,下列项目将被安装于你的工作站上。

表18.7 安装的文件名

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

项 目  描 述

  ──────────────────────────────────────

SQLD-IB.DLL 包含InterBase驱动程序和支持文件的动态链接库

SQLINT32.DLL

INTRBASE驱动类型  加在配置工具的驱动管理程序中以配置基本的Borland

InterBase SQL Link驱动程序

INTRBASE别名类型  加入配置文件的别名以使建立联接SQL服务器数据库的

别名

SQLD_IB.HLP 配置InterBase驱动程序的帮助文件

READLINK.TXT Borland SQL Links for Windows自述文件

INTERBAS.MSG InterBase消息文件,通常安装上C:\INTERBAS

CONNECT.EXE 测试工作站和InterBase服务器连接情况的工具

REMOTE.DLL、 InterBase的支持动态链接库

GDS.DLL、GDS32.DLL

将InterBase服务器描述 安装过程修改工作站的SERVICES文件以增加用于

加入SERVICES文件  InterBase 服务器访问所需的协议描述 ,

如:gds- db 3050/tcp

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  软件项目中还应包括TCP/IP接口软件

  下表列出的文件给InterBase客户端应用提供访问Winsock 1.1的接口

表18.8 TCP/IP接口软件

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

文 件 名 描 述

  ────────────────────────────────

MVWASYNC.EXE 异步通信模块

   VSL.INT TCP/1P传输初始化文件

WINSOCK.DLL Windows Socket动态链接库

   MSOCKLIB.DLL 将Windows Socket调用映射到VSL驱动程序

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

如果TCP/IP产品不是Winsock1.1兼容,InterBase客户端应用将也可采用其它TCP/1P 驱动程序。InterBase服务器还可支持其它通信协议,如SPX/1PX,NetBeIU等。

4. 解决一般的联接问题

如果用SQL Links建立与InterBase服务器的连接有问题可采用下列步骤来分离问题原因:

⑴ 通过Windows ISQL工具测试能否与InterBase服务器联接

如果成功,状态信息会出现,并继续步骤⑵。

如果不成功,询问数据库管理员。

⑵ 检验InterBase SQL Links 驱动程序是否正确安装。

⑶ 重新安装SQL Links。

⑷ 检查SERVICES,文件中应有行:

gds_db 3050/tcp

如果不能正确安装,就请询问数据库管理员,否则继续步骤⑸。

⑸ 测试底层协议

① 输入TELNET命令,确认TCP库是否正确安装。

如果TCP库正确安装,注册提示符会出现。注册入网检查数据库是否存在。

如果消息是“can't resolve hostname” 出现,检查工作站的HOSTS文件是否有你 的主机名和IP地址的人口。如:

128.127.50.12 mis_server

如果用TELNET是成功的,但仍然无法正确联接,则没有正确安装InterBase。请寻

求数据库管理员的帮助。

② PING到服务器服务器上,测试InterBase服务器是否正常运行并且为桌面应用可见

(如果PING是成功的,消息“servername is alive”被显示)。

PING成功但TELNET不成功,则inet daemon可能有问题。

如果PING到服务器上不成功,则有网络路径问题,将问题报给网络管理员。

如果底层协议不正常,请询问数据库管理员,否则继续帮助⑹。

⑹ 确认是否有InterBase服务器的访问权,如果有请继续步骤⑺。

⑺ 检查BDE应用程序的InterBase别名是否正确安装。

如果能够直接从工作站上联接,但不能从BDE应用程序中,那么很有可能你的

IDAPI32.CFG别名设置有问题。运行BDE配置工具检查InterBase别名。

18.3 Delphi Client/Server编程

本节介绍如何运用Delphi可视化开发工具和ObjectPascal语言开发Client\Server的数据库应用程序,采用的例子是CSDEMOS。这是Delphi2.0自带的演示Client\Server开发的例子,它安装在C:\Program Files\Borland\Delphi 2.0\Demos\DB\CSDemos中(缺省安装)。

本节将包含以下内容:

使用TDatabase部件连接SQL服务器

用DataSet部件(又称数据集部件),如TTable和TQuery,联接TDatabase部件并访问数据库以及各种表之间如何切换

使用数据库连接

触发器的使用方法

TStoredProc部件的使用方法

客户和服务器之间的事务控制

TStoredProc部件的使用方法

18.3.1 使用TDatabase部件联接SQL服务器

18.3.1.1 TDatabase部件概述

TDatabase部件处理应用程序与单个数据库的联接。如果不需要控制数据库联接,可以不用创建TDatabase部件。当应用程序试图打开数据库表(Table)时,会自动创建一个临时的TDatabase部件。但如果你想控制数据库的持续联接、进入数据库服务器的注册和数据库别名的值或事务控制,那么你就必须为每个所需的联接创建一个TDatabase部件。

  1. 创建TDatabase部件

TDatabase 部件在Component Palette中的Data Access页上,你能将其拖放在数据模块(Data module)或窗体中。在设计时创建TDatabase 部件,用户可以设置初始值和编写OnLogin事件处理过程(Event Handle)。OnLogin事件给用户提供了第一次注册数据库服务器时定制服务器安全参数,如口令,的能力。

  2. TDatabase的关键属性

⑴ DatabaseName属性

DatabaseName是所要联接的数据库名,并且用于DataSet软件,它将出现在DataSet部件的DatabaseName属性的下拉式列表框中。设置DataBaseName属性是定义数据库应用的特定别名。DataSet部件能引用该名字以取代直接使用BDE别名。当TDatabase部件的Connected属性为True时不能修改该属性。

⑵ AliaName属性

AliasName是BDE配置工具定义的BDE别名的名字。TDatabase 从中获取其缺省的设置。如果设置DriveName属性,则该属性将被清除,如果当Connected为True 时强行设置DriveName属性将引发异常。

⑶ DriveName属性

DriveName是BDE驱动程序,如STANDARD 、ORACLE、SYBASE、INFORMIX或INTERBASE的名字。如果设置AliasName,则该属性值将被清除。

⑷ Params属性

Params属性包含了打开SQL服务器上数据库时所需的参数。在缺省情况下,这些参数由BDE配置工具设置;用户也可以用数据库参数编辑器(Database Parameters Editor)修改这些参数。对于数据库服务器而言,Params将描述一系列的参数,如服务器名、 数据库名、用户名和口令。

⑸ Connected属性

Connected属性指明是否建立数据库的联接,当应用程序打开数据库中的一个表时Connected将被置为True;反之,关闭数据库表,Connected将被置为False,除非KeepConnection为True。而将Connected置为True则可不需打开数据库表即可建立数据库联接。TDatabase的KeepConnection属性描述当数据库中没有表打开时是否维持数据库联连。

⑹ KeepConnection属性

KeepConnection属性描述当数据库中没有打开表时是否要保持与服务器的联连, 如果数据库应用需要打开和关闭单个数据库中的多个表时,将KeepConnection 设置为True是很有用的,那样,即使没有打开任何表,应用仍能保持与数据库的联接,它能够重复地打开和关闭数据库表,而不需要重复执行联接过程。如果KeepConnection置为False,当每次将Connected置为True,数据库都必须执行注册过程。

⑺ LoginPrompt属性

LoginPrompt属性用于控制如何处理SQL数据库的安全性问题。如置为True,当应用程序试图建立数据库联接时屏幕上将出现标准Delphi注册对话框。用户必须输入正确的用户名和口令。如果置为False,则应用程序将寻找TDatabase部件的Params 属性中的注册参数。下面是USERNAME和PASSWORD参数的例子:

  USERNAME = SYSDBA

PASSWORD = masterkey

⑻ TransIsolation属性

TransIsolation属性描述SQL服务器所有的事务控制独立级别。 tiDirtyRead使所有修改都被返回,而不管记录是否已被提交。tiReadCommitted将只返回提交的记录,而提交的修改将不会在结果中反映出来。tiRepeatableRead 将只返回事务过程中最初的记录,即使另一个应用程序将所作的修改提交。

各种数据库服务器可能不同程度地支持这些独立级别,或者根本不支持。 如果需要的独立级别不被服务器支持,那么Dephi将使用下一个更高的独立级别,如下表所示:

表18.10 各类服务器TransIsolation设置

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

独立级别 Oracle Sybase和 InterBase

Microsoft SQL

──────────────────────────────────────

Dirty Read Read Committed Read Committed Read Committed

Read Committed Read Committed Read Committed Read Committed

Repeatable read Repeatable read Not Supported Repeatable Read

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

各个独立级别的含义请见表18.12。

3. TDatabase的关键方法

  ⑴ StartTransaction方法

StartTransartion方法在由TaransIsolation属性指定的独立级别下开始事务控制。如果在一个事务已被激活的情况下调用该方法,Delphi将引发异常。

调用了该方法后,对数据库所做的修改一直由数据库服务器维持到调用Commmit方法提交数据或调用Rollback方法取消修改为止。只有当联接数据库服务器时,才能调用该方法。

⑵ Rollback方法

Rollback方法返转当前事务控制,并且取消自最近一次调用StartTransaction以来对数据库所做的所有修改。

⑶ Commit方法

Commit方法提交当前事务控制,并且将自最近一次调用StartTransaction以来所有数据修改存入数据库。

4. TDatabase的OnLogin事件的处理

OnLogin事件的触发条件是当联接SQL数据库的TDatabase部件被打开并且LoginPrompt属性为True。使用OnLogin事件处理过程可以在运行时设置注册参数。OnLogin 事件处理过程得到TDatabase的注册参数数组Params,并且使用Values属性改变这些参数。

例如:

 LoginParams.Vaiues['SERVER NAME'] := 'MYSERVERNAME';

LoginParams.Values['USER NAME'] := 'MYUSERNAME';

LoginParams.Values[PASSWORD'] := 'MYAPSSWORD';

当控制从OnLogin事件处理过程中返回时,应用程序用这些参数来建立联接。

OnLogin事件处理过程的声明是这样的:

TLoginEvent = procedure(Database: TDatabase; LoginParam: TStrings) of Object;

property OnLogin: TLoginEvent;

TLoginEvent类型是处理OnLogin事件的方法头。Database参数是要联接的数据库。LoginParams是TStrings类型的对象,包含用户名和口令,以及打开数据库时所用的其它参数。用户名是形如USER NAME = John.Doe的字符串,口令是形如PASSWORD = is_Password的字符串。当OnLogin事件处理过程被调用时应当在LoginParams中加入用户名和口令。

18.3.1.2 定制数据库服务器的注册参数

大多数数据库服务器都包含限制数据库访问的安全特征。通常,在用户能访问数据库之前,服务器都要求注册的用户名和口令。

如果服务器需要注册,在设计阶段,Delphi 会在你试图联接时提示你,诸如在会TTable部件描述数据库表名时。

在缺省情况下,Delphi应用在打开数据库服务器的联接时,显示标准注册对话框。如果联接已建立,则注册对话框不会出现。

可以用下列方法处理服务器注册:

1. 将TDatabase部件的LoginPrompt属性置为True。这样,当应用程序试图建立数据库联接时,标准注册对话框会打开。

2. 将LoginPrompt属性置为False,在TDatabase部件的Params属性中包含用户名和口令参数。例如:

   USERNAME = SYSDBA

PASSWORD = mosterkey

但不推荐使用该方法,因为这会危害数据库安全

3. 使用TDatabase部件的OnLogin事件设置注册参数。OnLogin事件得到TDatabase 注册参数数组的拷贝,并利用Values属性改变这些参数。如:

   LoginParams.Values['SERVER NAME'] := 'MYSERVERNAME';

   LoginParams.Values['USER NAME'] := 'MYUERNAME';

   LoginParams.Values['PASSWORD'] := 'MYPASSWORD';

当控制从数据库注册事件处理过程中返回时,这些参数被用来建立联接。

18.3.1.3 建立应用程序特定的别名

TDatabase的Aliases描述了数据库表的位置和数据库服务器的联接参数。通常都是在Delphi之外,运用BDE配置工具(BDECFG32.EXE)创建别名,并且别名被存在BDE 配置文件IDAPI32.CFG中。

用户也可以用TDatabase创建只在应用程序中可用的别名,用TDatabase 创建的别名不会加进BDE配置文件中。任何DataSet部件可通过描述DatabaseName 属性来使用这些别名。为了定制这些局部别名的参数,用鼠标左键双击TDatabase部件或从TDatabase部件中选择Database Editor,Delphi就会打开数据库属性编辑器(Database Properties Editor)。

18.3.1.4 控制数据库的联接

TDatabase部件的Connected属性,指示TDatabase部件是否建立与数据库服务器的联接。当应用程序打开数据库中的表时,Connected被设置为True。将Connected 设为True就建立了数据库的联接。

1. 保持数据库联接

TDatabase的KeepConnection属性描述当没有数据库表打开时是否要与保持数据库的联接。

如果应用程序需要在单个数据库中多次打开关闭多个表时,将KeepConnection 置为True能使应用程序具备更好的性能。

当KeepConnection为True时,即使没有表打开,应用程序也能保持数据库的联接。那么就能重复打开和关闭数据库表而不需每次进行联接注册。

2. 使用TSesstion控制联接

 TSesstion部件有一个面向整个应用程序的KeepConnections属性。如果Session.KeepConnections为True,那么用于所有TDatabase部件的数据库联接都是持久的。

TSession为应用程序提供数据库联接的全局控制。TSession中的Databases 属性是Session中所有活跃数据库组成的数组,DatabasesCount属性描述活跃数据库的数目。

3. 描述Net和Private目录

TSession的NetFileDir属性描述BDE网络控制目录的路径。TSession的PrivateDir属性描述存储诸述处理局部SQL表达式的临时文件的目录的路径。

18.3.1.5 获取数据库信息

TSession拥有许多让用户获取数据库有关的信息,每个方法都以TStringList 部件作为传入参数,并将信息返回TStringList中。

1. GetAliasNames方法

声明:procedure GetAliasNames(List: TStringList);

GetAliasNames方法消除List中的参数,并将所有已定义的BDE别名的名字写入List。应用程序生成的别名不包括在内。

2. GetAliasParams方法

声明:procedure GetAliasParams(const AliasName: String; List: TStringList);

GetAliasParams方法清除List的内容,并将BDE别名为AliaName的参数写入List。

3. GetDatabaseNames方法

声明:procedure GetDatabaseNames(List: TStrings);

GetDatabaseNames方法清除List的内容并将所有BDE别名和应用程序定义的别名的名字写入List。

4. GetDriverNames方法

声明:procedure GetDriverNames(List: TStrings);

GetDriverNames方法清除List中的内容,并将BDE当前安装的驱动程序名写入List。

5. GetDriverParams方法

声明:procedure GetDriverParams(const DriverName: String; List: TStrings);

GetDriverParams方法消除List中的内容,并将名为DriveName驱动程序缺省参数写入List。

6. GetTableNames方法

声明:procedure GetTableNames(const DatabaseName, Pattern: Strings;

Extensions, SystemTable: Boolean; List: TStrings);

GetTableNames方法消除List中的内容,并将名为DatabaseName的数据库中的所有表的名字写入List。Pattern参数将限制表名。对于SQL服务器,将SystemeTables设为True将获取系统表和用户表。对非SQL数据库,将Extensions设为True将在表名中包含扩展名。

18.3.2 处理Client/Server事务控制

使用隐式控制和显示控制的数据库应用中有两种方法管理事务控制:

 运用TDatabase部件的属性和方法进行显式控制

  运用TQuery部件的传递式SQL控制事务

Delphi还支持Paradox和dBASE表的局部事务处理

18.3.2.1 事务控制概述

当用Delphi创建数据库应用时,Delphi提供了用为所有数据库访问的事务控制。

事务是这样一组操作,在被提交前,它们对一个或多个数据库的操作,必须全部执行成功。如果其中一个操作失败,则所有操作失败,即事务具有原子性。

即使发生硬件失败,事务也要保证数据库一致性。当允许多用户并发访问时,事务还要维持数据完整性。

例如:一个应用程序可能更新ORDERS表以指明接受购买某一项目的定单,那么也要更新INNENTORY表以反映库存的减少。如果在第一个更新之后,第二个更新之前发生硬件错误,数据库就会处于不一致状态,因为库存情况没有反映定单情况。在事务控制下,两个表达式将在同一时间提交,如果其中一个表达式失败,则被返转(Rolled Back)。

18.3.2.2 使用隐式控制

在缺省情况下,Delphi通过BDE为应用程序提供隐式事务控制。当应用程序处于隐式事务控制时Delphi为DataSet中的写每个记录进行隐式事务控制。它提交每一个独立的写操作,如Post和Append Record。

使用隐式事务控制是容易的,它保证最小的记录更新冲突和数据库的一致性视图。另一方面,因为写入数据库的数据的每一行都要进行事务控制, 所以隐式事务控制将导致网络过忙和应用程序性能下降。

如果采用显式事务控制,就能选择最有效的时机来开始、提交和终止事务,特别是在开发多用户环境下的客户应用程序运行访问远程SQL服务器,就更应该采用显式控制。

18.3.2.3 使用显式事务控制

有两种协作又独立的方式可运用于Delphi数据库应用的事务控制:

使用TDatabase部件的方法和属性

使用TQuery部件中的传递式SQL。这种方式只有在Delphi Client/Server Suite版中才有效,SQL Links将SQL表达式直接传给过程SQL或ODBC服务器

使用TDatabase部件的方法和属性的好处是提供了清晰的、轻便的、与特定数据库或服务器无关的应用能力。

使用传递式SQL的主要好处在于可以运用特定服务器的先进事务管理能力。

  1. 使用TDatabase的方法和属性

下表中列出了TDatabase部件中用于事务管理的方法和属性以及它们的使用方法:

表18.11 TDatabase用于事务显式控制的方法表

  ━━━━━━━━━━━━━━━━━━━━━━━━

   方法或属性  作 用

  ────────────────────────

Commit 提交数据的修改并终止事务

Rollback 取消数据的修改并终止事务

StartTransaction 开始一个事务

TransIsolation 表述事务的独立性级别

  ━━━━━━━━━━━━━━━━━━━━━━━━

StartTransaction,Commit和Rollback是供应用程序在运行时调用开始事务,控制事务并且保存或放弃所做数据修改的方法。

TransIsolation是TDatabase部件的用于控制作用于相同表的不同事务之间如何交互的属性。

⑴ 开始一个事务

当你开始一个事务时,后来的所有读写数据库的表达式都发生在那次事务的环境中。每个表达式都是其中一部分。任何表达式所做的修改,要么成功地提交给数据库,要么每一个修改都被取消。考虑一个在ATM上的银行传输问题。当顾客决定将钱从存款帐户转到支付帐户时,在银行数据库记录上必须发生两个修改:

存款帐户必须记入借方

支付帐户必须记入贷方

如果出于某种原因,其中的一个操作不能被完成,那么任何一个操作都不应该发生。因为这些操作是相关的,它们应该发生在同一个事务中。

为了开始Delphi应用程序中的一个事务,需要调用TDatabase部件中的StartTransaction方法:

DatabaseInterBase.StartTransaction;

此后的所有数据操作都发生在最近一个事务的环境中,直到该次事务通过调用Commit或Rollback显式地终止为止。

那么,应当将事务保持多久呢?理想状态下,只要需要,多久都行。事务的活跃状态越长,同时访问数据库的用户越多,在你的事务的生命其中,更多的并发、同时的事务开始和终止,于是当试图提交修改时,与其它事务冲突的可能性更大。

⑵ 提交一个事务

为了做永久性修改,事务必须使用TDatabase部件的Commit方法提交。执行提交表达式将保存数据库的修改并终止事务。例如,下列表达式将终止在上例中开始的事务:

DatabaseInterBase.Commit

Commit的调用应当置于try…except表达式中。如果一个事务不能成功提交,你就能处理错误,并重试操作。

⑶ 返转一个事务

为了取消数据库修改,必须用Rollback方法返转一个事务。Rollback 复原一个事务的修改,并终止事务,例如:下列表达式将返转一个事务:

 DatabaseInterBase.Rollback;

Rollback通常发生在:

异常处理代码

 按钮或菜单事件代码,如用户点按了Cancel按钮

⑷ 使用TransIsolation属性

TransIsolation属性描述TDatabase部件事务的独立级别,事务的独立级别决定了事务与其它作用于相同表的事务是如何相互作用的。在改变或设置TransIsolation 的值之前,应当相当熟悉Delphi中的事务和事务管理。

TransIsolation的缺省值是tiReadCommitted。下表中总结了TransIsolation的可能值并描述了它们的含义:

表18.12 TransIsolation属性值的含义

 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

   独立级别   含 义

──────────────────────────────────────

  tiDirtyRead 允许读由其它同时事务写入数据库的未提交的修改。未提交的

修改不是永久性的,可能在任何时候被复原。 在这个级别你

的事务与其它事务所做的修改具有最低独立度。

tiReadCommitted 只允许读由其它同时事务提交的数据库修改。这是缺省的独

立级别。

tiRepeatableRead 允许单个的数据库读事务无法看见其它同时事务对相同数据做

的修改。这个独立级别保证了你的事务一次读一个记录,记录

的视图不会改变, 在这个级别你的事务与其它事务做的修改完

全独立。

 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

各种数据库服务器不同程度地支持这些独立级别,有的根本不支持。 如果请求的隔离级别不被服务器支持,Delphi将采用更高的独立级别。各种服务器支持的独立级别请参见表18.10。

如果应用程序使用ODBC与服务器交互,ODBC驱动程序必须支持独立级别。

2. 使用传递式SQL

为了能使用传递式SQL控制事物,必须:

  使用Delphi Client/Server Suite

安装正确的SQL Links驱动程序

  正确配置网络协议

  访问远程服务器上数据库的能力

  用BDE配置工具将SQLPASSTHROUGH MODE设置为NOT SHARED

通过传递式SQL,你可以使用TQuery、TStoredProc、或TUpdateSQL部件直接发送一个SQL事务控制表达式给远程数据库服务器;BDE本身并不处理SQL表达式,采用传递式SQL可使用户直接获得SQL服务器提供了事务控制优点,尤其是当那些控制是非标准的时。

SQL PASS THROUGHMODE 描述BDE和传递式SQL是否共享相同的数据库联接。在大多数情况下,SQLPASSTHROUGHMODE被设置SHARED AUTOCOMMIT。然而,如果你想将SQL事务控制传递给服务器,你就必须用BDE配置工具,将BDE的SQLPASSTHROUGHMODE 设置为NOT SHARED。此外,还必须为传递SQL事务控制表达式的TQuery部件建立独立的TDatabase 部件。

3. 使用本地事务

BDE还支持Paradox和dBASE上的本地事务。从代码角度而言,在本地事务和远程数据库服务器的事务之间没有什么差别。

当作用于本地数据库表的事务开始时,更新操作被记录在日志中,每个日志记录包含旧的记录缓冲区。当事务处于活跃状态,更新的记录被锁定,直到事务被提交或返转,在返转过程中,旧的记录被应用于将更新的记录恢复到原先的状态。

18.3.3 使用存储过程

18.3.3.1 TStoredProc部件概述

存储过程是以数据库服务器为基础的接受输入参数,并将结果返回给应用程序的一段程序。TStoredProc部件操作远程服务器上的数据库中的存储过程。存储过程是一连串表达式的集合,作为服务器的一部分存储。存储过程在服务器上执行一系列重复性的与数据库相关的任务,并将结果传给客户应用程序,如Delphi数据库应用程序。

TStaredProc部件使Delphi数据库应用程序能执行服务器上的存储过程。

通常,作用于数据库表中大量记录并且使用统计或数学函数的操作都是存储过程的首选对象。通过将这些重复计算任务转移到服务器,可以提高数据库应用程序的性能。

充分利用服务器的处理能力和速度

 减少网络传输的数量

例如,考虑一个需要计算单个值的应用程序,在大批记录中的标准差值。如果在Delphi应用程序中执行这项功能就必须从服务器中得到所有在计算中用到的记录,这必将导致网络拥塞。因为应用程序所需的只是代表标准差的最终返回值。因此,由服务器上的存储过程来读数据,执行计算和将值传给应用程序将更有效。

  1. TSoredProc的关键属性

⑴ DatabaseName属性

DatabaseName属性描述要访问的数据库的名字。该属性可以为:

已定义的BDE别名

本地型数据库的目录

Local InterBase服务器的目录路径和文件名

TDatabase定义的应用程序别名

在改变DatabaseName之前要使用Close方法将Dataset部件置为非活跃状态。

⑵ StoredProcName属性

StoredProcName属性表示服务器上的存储过程名。Oracle服务器允许多个具有相同名字的存储过程。因此要设置Overload属性来描述执行在Oracle服务器上的存储过程名。

⑶ Overload属性

Oracle服务器允许Oracle软件包中存储过程的重载。就是说具有相同名字的不同过程,设置Overload属性用来描述执行在Oracle服务器上的存储过程。如果Overload值为零,则假定没有重载,如果Overload为1,则Delphi执行具有同名的第一个存储过程;如果值为2,则执行第二个存储过程。

⑷ Params属性

Params属性包含传给存储过程的参数。

  2. 关键方法

⑴ ParamByName方法

声明:function ParamByName(const Value: String): TParam;

ParamByName方法返回Params属性中具有名为Value的元素值。一般用该方法在动态查询中给参数赋值。

⑵ Prepare方法

PrePare方法准备要执行的存储过程,这允许服务器载入存储过程,否则准备处理异常。

⑶ ExecProc方法

ExecProc方法执行服务器上的存储过程。

⑷ Open方法

Open方法打开DataSet部件,并将其置于浏览状态。这相当于将Active属性置为True。对于TStoredProc如果存储过程返回一个结果集,则使用Open执行存储过程。如果存储过程返回单行,早使用ExecProc执行存储过程。

18.3.3.2 TStoreProc使用方法

  1. 建立一个StoredProc部件

为数据库服务器上的存储过程建立一个TStoredProc部件的步骤如下:

⑴ 从Component Palette的Data Access页选择TStoredProc部件放在数据模块上。

⑵ 将TStoredProc部件的DatabaseName属性设置为存储过程所在的数据库名。

DatabaseName必须是BDE别名。

⑶ 将TStoredProc部件的StoredProcName属性设为所用的存储过程名,或者从下拉式

列表框中选择。

⑷ 在TStoredProc部件的Params属性中描述输入参数。可以使用参数编辑器来设置输

入参数。参数编辑器也可让用户察看存储过程返回给应用程序的值。

  2. 设置存储过程的输入参数,察看输出结果参数

许多存储过程需要给它们传入一系列的输入参数,以确定处理什么和怎样处理,在Params属性中描述这些参数。所描述的输入参数的顺序是很重要的,它由服务器上的存储过程来确定。在设计时,最容易和最安全的方法是激活TStoredProc参数编辑器,编辑输入参数。参数编辑器以正确的次序列出输入参数,让你给它们赋值。

要激活TStoredProc的参数编辑器:

① 选择TStoredProc部件。

  ② 按鼠标右键激活加速菜单(Speed Menu)。

③ 选择Define Parameters。

参数名列表框显示过程的所有输入,输出和结果参数。有关输入、输出参数的信息从服务器中获得。对于某些服务器而方,参数信息是不可访问的,如Sybase,在这种情况下,列表框是空的,因此必须自己按过程要求的顺序增加输入输出参数。

参数类型复选框中描述所选的参数是输入、输出,还是结果参数。如果服务器支持参数可以既是输入又是输出。如果在列表框中增添参数,就必须设置参数类型。

数据类型复选框,列出列表框中所选参数的数据类型。如果给列表框真善美参数,必须设置数据类型。

在值编辑框中给输入参数赋值。

如果服务器不传递存储过程信息给Delphi,则可以用Add按钮给存储过程增添参数。Delete按钮则是将增添的参数删除,Clear按钮将清除列表框中所有参数。

设置完参数后,选择OK按钮。

  3. 在运行时建立参数和参数值

在运行时建立参数,可直接访问Params属性。Params属性是参数字符串的数组。例如,下列代码将编辑框的文本赋给数组的第一个字串:

StaredProc1.Params[0].Asstring := Edit1.Text

也能够用ParamsByName方法通过名字访问参数:

StoredProc1.ParamsByName('Company') Asstring := Edit1.Text;

  4. 准备和执行存储过程

要使用存储过程还必须准备并执行它。可以有两种方式准备一个存储过程:

  在设计时,通过选择参数编辑器的OK按钮

  在运行时,通过调用TStoredProc的Prepare方法

例如,下面的代码准备存储过程的执行:

  StoredProc1.Prepare;

要执行准备好的存储过程,调用TStroedProc部件的ExecProc方法。下列代码演示了准备和执行存储过程:

   StoredProc1.Params[0] Asstring := Edit1.Text;

StoredProc1.prepare;

StoredProc1.ExecProc;

当你执行一个存储过程,它返回输出参数或结果集,有两种可能的返回类型:单个返回,如单值或值集,和一群结果集,返回很多值。

  5. 访问输出参数和结果集

存储过程在输出参数数组中返回值。如果服务器支持返回值可以是单个结果或者结果集。

在运行时访问存储过程的输出参数,可以索引Params属性或者用ParamByName方法访问这些值。下列表达式都用输出参数设置了编辑框的值:

Edit1.Text := StoredProc1.Params[6].AsString;

   Edit1.Text := StoredProc1.ParamsByName('Contact').AsString;

如果存储过程返回结果集,则用标准数据相关控制访问和显示值会更有用。

在某些服务器上如Sybase,存储过程能象查询语句那样返回结果集,应用程序可以使用数据相关控制一显示这些存储过程的输出。

用数据相关控制显示存储过程返回结果的方法如下:

① 将DataSource部件放在数据模块上。

 ② 将DataSource部件的DataSet属性设置为接收数据的TStoredProc部件的名字。

③ 将数据相关控制的DataSource属性设为DataSource部件的名字。

这样,当用于TStoredProc部件和Active属性为True时,数据相关控制就能显示从存储过程返回的结果。

18.3.4 从开发平台到服务器的向上适化