汇编 | Java | C# | Delphi | C/C++ |

DELPHI基础教程 第十八章 Delphi客户服务器应用开发(三)

第十八章 Delphi客户服务器应用开发(三) 本文来自织梦

3. 安装的软件项目 copyright dedecms

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

18.7 安装的文件名 内容来自dedecms

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

copyright dedecms

   目        描

织梦好,好织梦

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

本文来自织梦

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

dedecms.com

SQLINT32.DLL 内容来自dedecms

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

InterBase SQL Link驱动程序 copyright dedecms

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

copyright dedecms

别名

内容来自dedecms

  SQLD_IB.HLP 配置InterBase驱动程序的帮助文件 织梦内容管理系统

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

内容来自dedecms

  INTERBAS.MSG InterBase消息文件,通常安装上C:\INTERBAS 本文来自织梦

CONNECT.EXE 测试工作站和InterBase服务器连接情况的工具 织梦内容管理系统

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

本文来自织梦

  GDS.DLLGDS32.DLL

织梦内容管理系统

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

  加入SERVICES文件  InterBase 服务器访问所需的协议描述 本文来自织梦

如:gds- db 3050/tcp

本文来自织梦

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 织梦内容管理系统

 

内容来自dedecms

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

织梦内容管理系统

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

  dedecms.com

18.8 TCP/IP接口软件

内容来自dedecms

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

织梦内容管理系统

   名       描 本文来自织梦

  ──────────────────────────────── 本文来自织梦

  MVWASYNC.EXE 异步通信模块

dedecms.com

   VSL.INT TCP/1P传输初始化文件 内容来自dedecms

  WINSOCK.DLL Windows Socket动态链接库

dedecms.com

   MSOCKLIB.DLL Windows Socket调用映射到VSL驱动程序 内容来自dedecms

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 本文来自织梦

  织梦内容管理系统

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

4. 解决一般的联接问题

内容来自dedecms

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

通过Windows ISQL工具测试能否与InterBase服务器联接 内容来自dedecms

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

织梦好,好织梦

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

本文来自织梦

检验InterBase SQL Links 驱动程序是否正确安装。 内容来自dedecms

重新安装SQL Links

织梦好,好织梦

检查SERVICES,文件中应有行:

织梦好,好织梦

  织梦内容管理系统

gds_db 3050/tcp 内容来自dedecms

 

织梦好,好织梦

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

内容来自dedecms

测试底层协议 织梦内容管理系统

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

织梦好,好织梦

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

织梦内容管理系统

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

  dedecms.com

128.127.50.12 mis_server

copyright dedecms

 

内容来自dedecms

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

织梦好,好织梦

求数据库管理员的帮助。

copyright dedecms

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

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

本文来自织梦

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

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

 

织梦内容管理系统

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

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

dedecms.com

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

织梦好,好织梦

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

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

织梦好,好织梦

  织梦内容管理系统

  copyright dedecms

18.3 Delphi Client/Server编程

织梦内容管理系统

  织梦内容管理系统

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

  本节将包含以下内容:

本文来自织梦

使用TDatabase部件连接SQL服务器

dedecms.com

  ● DataSet部件(又称数据集部件),如TTableTQuery,联接TDatabase部件并访问数据库以及各种表之间如何切换 内容来自dedecms

  ● 使用数据库连接 织梦好,好织梦

  ● 触发器的使用方法

内容来自dedecms

  ● TStoredProc部件的使用方法

dedecms.com

  ● 客户和服务器之间的事务控制 内容来自dedecms

  ● TStoredProc部件的使用方法 织梦内容管理系统

  内容来自dedecms

18.3.1 使用TDatabase部件联接SQL服务器 本文来自织梦

 

织梦好,好织梦

18.3.1.1 TDatabase部件概述

copyright dedecms

  织梦内容管理系统

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

织梦好,好织梦

  1. 创建TDatabase部件

织梦内容管理系统

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

  2. TDatabase的关键属性 copyright dedecms

DatabaseName属性 本文来自织梦

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

  ⑵ AliaName属性

本文来自织梦

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

本文来自织梦

  ⑶ DriveName属性

内容来自dedecms

DriveNameBDE驱动程序,如STANDARD ORACLESYBASEINFORMIXINTERBASE的名字。如果设置AliasName,则该属性值将被清除。

本文来自织梦

  ⑷ Params属性

dedecms.com

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

  ⑸ Connected属性

copyright dedecms

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

  ⑹ KeepConnection属性

织梦好,好织梦

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

织梦内容管理系统

  ⑺ LoginPrompt属性 织梦内容管理系统

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

  dedecms.com

  USERNAME = SYSDBA

copyright dedecms

PASSWORD = masterkey

copyright dedecms

 

dedecms.com

  ⑻ TransIsolation属性 本文来自织梦

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

织梦内容管理系统

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

织梦好,好织梦

 

织梦好,好织梦

18.10 各类服务器TransIsolation设置

本文来自织梦

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 内容来自dedecms

  独立级别     Oracle Sybase和     InterBase

织梦内容管理系统

Microsoft SQL 织梦内容管理系统

────────────────────────────────────── 内容来自dedecms

Dirty Read Read Committed Read Committed Read Committed

织梦内容管理系统

Read Committed Read Committed Read Committed Read Committed

dedecms.com

Repeatable read Repeatable read Not Supported Repeatable Read 内容来自dedecms

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 织梦内容管理系统

 

copyright dedecms

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

本文来自织梦

  本文来自织梦

3. TDatabase的关键方法

织梦好,好织梦

  StartTransaction方法

本文来自织梦

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

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

  ⑵ Rollback方法 织梦内容管理系统

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

内容来自dedecms

  ⑶ Commit方法 copyright dedecms

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

dedecms.com

4. TDatabaseOnLogin事件的处理 织梦内容管理系统

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

copyright dedecms

  例如: copyright dedecms

  copyright dedecms

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

copyright dedecms

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

dedecms.com

LoginParams.Values[PASSWORD'] := 'MYAPSSWORD'; 织梦好,好织梦

 

dedecms.com

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

  OnLogin事件处理过程的声明是这样的: 织梦内容管理系统

  本文来自织梦

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

本文来自织梦

property OnLogin: TLoginEvent;

内容来自dedecms

  内容来自dedecms

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

织梦内容管理系统

 

织梦好,好织梦

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

内容来自dedecms

  内容来自dedecms

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

本文来自织梦

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

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

本文来自织梦

  可以用下列方法处理服务器注册: 织梦好,好织梦

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

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

copyright dedecms

 

内容来自dedecms

   USERNAME = SYSDBA

dedecms.com

PASSWORD = mosterkey

织梦好,好织梦

 

copyright dedecms

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

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

  dedecms.com

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

内容来自dedecms

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

   LoginParams.Values['PASSWORD'] := 'MYPASSWORD'; 织梦内容管理系统

  copyright dedecms

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

 

织梦好,好织梦

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

织梦内容管理系统

  内容来自dedecms

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

copyright dedecms

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

内容来自dedecms

 

copyright dedecms

18.3.1.4 控制数据库的联接

copyright dedecms

  内容来自dedecms

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

dedecms.com

  1. 保持数据库联接

内容来自dedecms

  TDatabaseKeepConnection属性描述当没有数据库表打开时是否要与保持数据库的联接。 内容来自dedecms

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

copyright dedecms

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

  2. 使用TSesstion控制联接 织梦内容管理系统

 TSesstion部件有一个面向整个应用程序的KeepConnections属性。如果Session.KeepConnectionsTrue,那么用于所有TDatabase部件的数据库联接都是持久的。 织梦内容管理系统

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

copyright dedecms

  3. 描述NetPrivate目录

dedecms.com

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

内容来自dedecms

  内容来自dedecms

18.3.1.5 获取数据库信息 内容来自dedecms

 

dedecms.com

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

dedecms.com

  1. GetAliasNames方法

织梦好,好织梦

  声明:procedure GetAliasNames(List: TStringList); 内容来自dedecms

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

织梦内容管理系统

  2. GetAliasParams方法

内容来自dedecms

  声明:procedure GetAliasParams(const AliasName: String; List: TStringList); 内容来自dedecms

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

dedecms.com

  3. GetDatabaseNames方法

本文来自织梦

  声明:procedure GetDatabaseNames(List: TStrings);

织梦内容管理系统

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

织梦好,好织梦

4. GetDriverNames方法

dedecms.com

  声明: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;

内容来自dedecms

Extensions, SystemTable: Boolean; List: TStrings); 内容来自dedecms

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

  本文来自织梦

18.3.2 处理Client/Server事务控制

dedecms.com

  内容来自dedecms

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

copyright dedecms

 ● 运用TDatabase部件的属性和方法进行显式控制 织梦好,好织梦

  运用TQuery部件的传递式SQL控制事务 本文来自织梦

  本文来自织梦

  Delphi还支持ParadoxdBASE表的局部事务处理 内容来自dedecms

 

本文来自织梦

18.3.2.1 事务控制概述 本文来自织梦

 

内容来自dedecms

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

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

织梦内容管理系统

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

本文来自织梦

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

织梦内容管理系统

  织梦内容管理系统

18.3.2.2 使用隐式控制

内容来自dedecms

 

织梦好,好织梦

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

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

织梦好,好织梦

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

  织梦好,好织梦

18.3.2.3 使用显式事务控制

本文来自织梦

 

本文来自织梦

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

  ● 使用TDatabase部件的方法和属性 dedecms.com

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

织梦内容管理系统

 

织梦内容管理系统

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

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

织梦内容管理系统

  1. 使用TDatabase的方法和属性 dedecms.com

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

 

copyright dedecms

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

dedecms.com

  ━━━━━━━━━━━━━━━━━━━━━━━━ dedecms.com

   方法或属性     

织梦好,好织梦

  ──────────────────────── 织梦好,好织梦

  Commit 提交数据的修改并终止事务 织梦内容管理系统

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

织梦好,好织梦

  StartTransaction 开始一个事务 本文来自织梦

  TransIsolation 表述事务的独立性级别 本文来自织梦

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

织梦好,好织梦

  织梦好,好织梦

  StartTransactionCommitRollback是供应用程序在运行时调用开始事务,控制事务并且保存或放弃所做数据修改的方法。 内容来自dedecms

  TransIsolationTDatabase部件的用于控制作用于相同表的不同事务之间如何交互的属性。 内容来自dedecms

  ⑴ 开始一个事务 内容来自dedecms

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

dedecms.com

  ● 存款帐户必须记入借方 copyright dedecms

  ● 支付帐户必须记入贷方

内容来自dedecms

  dedecms.com

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

织梦内容管理系统

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

  dedecms.com

  DatabaseInterBase.StartTransaction;

织梦好,好织梦

  本文来自织梦

此后的所有数据操作都发生在最近一个事务的环境中,直到该次事务通过调用CommitRollback显式地终止为止。 本文来自织梦

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

copyright dedecms

  ⑵ 提交一个事务

本文来自织梦

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

  内容来自dedecms

  DatabaseInterBase.Commit 内容来自dedecms

  dedecms.com

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

copyright dedecms

  ⑶ 返转一个事务 内容来自dedecms

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

本文来自织梦

 DatabaseInterBase.Rollback; 内容来自dedecms

 

dedecms.com

Rollback通常发生在:

织梦内容管理系统

  ● 异常处理代码

织梦好,好织梦

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

织梦内容管理系统

 

本文来自织梦

  ⑷ 使用TransIsolation属性

copyright dedecms

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

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

  dedecms.com

18.12 TransIsolation属性值的含义 copyright dedecms

 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 织梦好,好织梦

   独立级别         含 织梦内容管理系统

────────────────────────────────────── 本文来自织梦

  tiDirtyRead 允许读由其它同时事务写入数据库的未提交的修改。未提交的 织梦内容管理系统

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

dedecms.com

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

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

             立级别。 本文来自织梦

  tiRepeatableRead 允许单个的数据库读事务无法看见其它同时事务对相同数据做 织梦内容管理系统

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

织梦内容管理系统

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

全独立。

织梦好,好织梦

 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 本文来自织梦

 

dedecms.com

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

本文来自织梦

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

织梦内容管理系统

  2. 使用传递式SQL

copyright dedecms

  为了能使用传递式SQL控制事物,必须: 本文来自织梦

  使用Delphi Client/Server Suite

dedecms.com

安装正确的SQL Links驱动程序 织梦内容管理系统

  正确配置网络协议

内容来自dedecms

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

织梦内容管理系统

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

 

织梦好,好织梦

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

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

内容来自dedecms

  3. 使用本地事务

本文来自织梦

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

织梦内容管理系统

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

  本文来自织梦

18.3.3 使用存储过程

织梦好,好织梦

  copyright dedecms

18.3.3.1 TStoredProc部件概述 本文来自织梦

  copyright dedecms

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

本文来自织梦

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

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

本文来自织梦

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

dedecms.com

 ● 减少网络传输的数量 copyright dedecms

  本文来自织梦

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

  1. TSoredProc的关键属性 内容来自dedecms

  ⑴ DatabaseName属性

织梦内容管理系统

  DatabaseName属性描述要访问的数据库的名字。该属性可以为: 织梦内容管理系统

  ● 已定义的BDE别名

copyright dedecms

  ● 本地型数据库的目录 织梦好,好织梦

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

内容来自dedecms

  ● TDatabase定义的应用程序别名

dedecms.com

 

内容来自dedecms

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

  ⑵ StoredProcName属性 dedecms.com

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

  ⑶ Overload属性 内容来自dedecms

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

内容来自dedecms

  ⑷ Params属性 本文来自织梦

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

本文来自织梦

  2. 关键方法 本文来自织梦

  ⑴ ParamByName方法

内容来自dedecms

  声明:function ParamByName(const Value: String): TParam; 本文来自织梦

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

  ⑵ Prepare方法

dedecms.com

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

  ⑶ ExecProc方法 织梦好,好织梦

  ExecProc方法执行服务器上的存储过程。 本文来自织梦

  ⑷ Open方法

内容来自dedecms

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

 

本文来自织梦

18.3.3.2 TStoreProc使用方法

织梦好,好织梦

  本文来自织梦

  1. 建立一个StoredProc部件 dedecms.com

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

  ⑴ Component PaletteData Access页选择TStoredProc部件放在数据模块上。 内容来自dedecms

  ⑵ TStoredProc部件的DatabaseName属性设置为存储过程所在的数据库名。 内容来自dedecms

DatabaseName必须是BDE别名。

copyright dedecms

  ⑶ TStoredProc部件的StoredProcName属性设为所用的存储过程名,或者从下拉式 本文来自织梦

列表框中选择。 dedecms.com

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

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

 

内容来自dedecms

  2. 设置存储过程的输入参数,察看输出结果参数 织梦内容管理系统

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

织梦内容管理系统

  要激活TStoredProc的参数编辑器:

织梦好,好织梦

选择TStoredProc部件。

织梦好,好织梦

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

织梦好,好织梦

选择Define Parameters

dedecms.com

 

织梦内容管理系统

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

织梦内容管理系统

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

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

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

本文来自织梦

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

copyright dedecms

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

  织梦内容管理系统

  3. 在运行时建立参数和参数值 织梦内容管理系统

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

  本文来自织梦

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

dedecms.com

  dedecms.com

  也能够用ParamsByName方法通过名字访问参数: 本文来自织梦

 

内容来自dedecms

  StoredProc1.ParamsByName('Company') Asstring := Edit1.Text; 内容来自dedecms

  本文来自织梦

  4. 准备和执行存储过程

dedecms.com

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

织梦好,好织梦

  在设计时,通过选择参数编辑器的OK按钮 本文来自织梦

  在运行时,通过调用TStoredProcPrepare方法 织梦好,好织梦

  dedecms.com

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

copyright dedecms

 

本文来自织梦

  StoredProc1.Prepare; 织梦好,好织梦

 

织梦好,好织梦

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

内容来自dedecms

 

内容来自dedecms

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

本文来自织梦

StoredProc1.prepare; 内容来自dedecms

StoredProc1.ExecProc;

copyright dedecms

  内容来自dedecms

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

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

copyright dedecms

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

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

内容来自dedecms

  dedecms.com

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

织梦好,好织梦

   Edit1.Text := StoredProc1.ParamsByName('Contact').AsString; 本文来自织梦

 

dedecms.com

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

dedecms.com

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

织梦内容管理系统

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

dedecms.com

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

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

织梦好,好织梦

  ③ 将数据相关控制的DataSource属性设为DataSource部件的名字。  内容来自dedecms

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

织梦内容管理系统

18.3.4 从开发平台到服务器的向上适化 本文来自织梦

精彩推荐
热点内容
最近更新