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)。