kylix 数据库应用简介
(施晓军2001年06月20日 10:56)
Kylix是业界著名的美国软件公司Borland正式发布的第一款专门为Linux操作系统推出的快速开发工具(Rapid Application Development,RAD)环境。它能为开发人员提供高效率的Web程序、桌面程序和数据库程序开发工具,使Linux开发人员可以在具有灵活的跨平台性能、可视化的Kylix开发环境中快速、方便地开发出高性能的Linux应用软件。
本文概括地介绍了在Kylix数据库应用开发中涉及到的主要组件对象,和对数据编辑、更新处理进行管理的策略。
一、dbExpress 及Kylix的数据提供/处理框架
Borland的Kylix所提供的dbExpress,是为很多数据库提供公共API的一种新的处理方法。dbExpress 的设计目标为:最小化系统资源的占用,最大化运行速度,提供平台独立性,提供易用的开发环境,使驱动程序的开发简易。
dbExpress的驱动程序既小又快,因为它们只提供了非常有限的功能。一个dbExpress驱动程序实现五个接口,支持获取metadata,执行SQL语句和存储过程,和返回只读的单向游标结果集等等。不管怎样,当被使用于DataSetProvider和ClientDataSet或SQLClientDataSet以实现Borland的提供/处理数据访问策略时,dbExpress 能为你提供全性能,高可靠性,高并发性的系统,使你很方便地处理SQL数据库中的数据。
Kylix使用四个组件来提供数据访问和编辑功能。一个就是SQLConnection组件,为你使用的数据库提供一个到dbExpress驱动程序的连接;另一个就是dbExpress dataset组件中的一个,通过执行一个SQL SELECT语句或调用一个存储过程来提供数据;还有就是DataSetProvider和ClientDataSet组件。当你打开ClientDataSet,它就会向DataSetProvider请求数据。DataSetProvider打开查询或存储过程组件,获取数据记录,然后关闭查询或存储过程组件,为ClientDataSet提供数据记录,或任何所需的metadata。ClientDataSet把数据记录保存在内存中,无论它们是在被浏览或更改。当用代码的形式,或者是通过用户界面,对记录作增加、删除或更改时, ClientDataSet把所有的更改都以日志的形式记录在内存中。为了更改数据库,你要调用ClientDataSet的ApplyUpdates方法。ApplyUpdates把更改日志传递给 DataSetProvider。DataSetProvider就开始一个事务,创建和执行相应的SQL语句,对数据库进行更改。如果所有的更改都被成功地执行,DataSetProvider就提交一个事务;否则,就会回滚该事务。如果发生一个错误导致事务回滚,ClientDataSet 的OnReconcileError事件就会被触发。
Kylix的这种提供/处理数据的框架的好处主要有:
1.缩短事务周期
长时间的事务会使数据库服务器长时间地加锁,会降低数据库的并发性能,并且会消耗数据库服务器的资源。使用Kylix的这种提供/处理数据的框架则可以降低事务周期。动态地降低资源消耗,提高一个忙碌的数据库服务器的并发性能。
2.使任何记录都是可编辑的
由多数据表连结、存储过程或只读视图返回的记录是不能直接在数据库应用中被编辑的。DataSetProvider给了你三种方法来处理这些情形。如果记录来自于一个单一的数据表,如,通过一个存储过程产生,可以为DataSetProvider创建返回该数据表名称的OnGetTableName事件句柄。第二种可能是多表联接中,来自某一单一数据表的字段需要被更改;解决方法是,首先,设置该字段的ProviderFlags属性,以表示该字段是要被更改的,然后, 创建一个OnGetTableName事件句柄以返回数据表的名称,DataSetProvider就会自动地产生相应的SQL语句。如果你要更改多数据表中的每个数据记录,解决方法是,为DataSetProvider增加一个BeforeUpdateRecord事件句柄。在该事件句柄中,你可以为每一个数据表产生SQL语句,并执行它们。
3.瞬时排序和搜索
由于ClientDataSet把记录保存在内存中,这些记录可以在内存中被快速排序。如果一个内存中的排序太慢,你可以在设计或运行时为ClientDataSet数据创建索引。这些创建在内存中的索引可以让你瞬时地改变记录的顺序或多记录进行定位,而不需要维护数据库中的索引。
4.自动统计信息
ClientDataSets能自动维护你定义的复杂的统计计算公式,如,Sum(Price)-Sum(Cost)。你也能对统计计算根据某一字段或字段的组合进行分组,从而提供分组统计信息。你也可以使用Min,Max,Count和Avg (average)等聚集运算。
5.观看数据的子集
使用符合SQL WHERE语法的过滤表达式,可以使你很容易地显示ClientDataSet的记录子集,而不需要数据库服务器执行任何查询操作。
6.多并发数据视图
克隆一个ClientDataSet游标的能力,可以让你同时观看一个ClientDataSet中数据记录的不同子集。你也可以以不同的排序观看相同的数据记录。
7.计算字段不再是高不可及
你可以在设计时为一个ClientDataSet设置计算字段,使计算字段是内存中数据记录集的一部分。 由于计算字段的计算功能是使用编译过的Object Pascal代码,因此,执行起来很快,虽然要比在一个SQL语句中的计算列或触发器中的计算复杂,但是,对于数据库服务器而言,则不需要任何存储或计算负担。
8.快速开发
使用dbExpress进行应用开发只需要两个共享的对象库。一个是dbExpress驱动程序,如,LIBSQLIB.SO用于Interbase,另一个是LIBMIDAS.SO,是ClientDataSet的支持库。这最小化了应用程序的规模,简化了安装。
9.很容易进行驱动程序创建
dbExpress驱动程序的实现仅需五个接口,并且已在在线帮助中被描述。Borland还提供了MySQL和 Interbase 驱动程序代码,这使数据库厂商能很容易地依照模型创建高性能的驱动程序。你甚至可以根据需要构建自己的驱动程序。
此外,Kylix的DataCLX是跨平台组件库,提供了访问数据的两组组件。DbExpress组件提供基本的连接和数据获取函数功能。数据访问组件提供了使用提供/解决框架编辑数据的能力。
二、数据获取与处理组件
如同所有的CLX组件,数据访问与处理组件可以让你快速构建你的应用程序,只需要把组件从组件板中拖出来,放在你的应用程序中就可以了。
1、SQLConnection
SQLConnection为任何dataset组件提供一个数据库连结。你可以使用多SQLConnection组件,同时和许多数据库相连。有三种方法定义一个数据库连结:使用一个已经存在的连接、创建一个新的命名连结,或者把连结参数放置在SQLConnection 组件的参数属性中。为了使用一个已经存在的连结,只需要设置ConnectionName属性。
为了创建一个新的命名连结,双击SQLConnection组件,打开dbExpress Connection编辑器。左边列表框中显示的连结名是已经被定义的。驱动程序下拉列表让你进行过滤以便只显示你所需的驱动程序。右边表格中的连结设置,显示所选取驱动程序的连结设置。你创建的所有连结被存储在dbxconnections.conf文件中。
创建了一个命名连结以后,你可以把它赋给SQLConnection 组件的ConnectionName属性。如果你使用了命名连结,你就要把连结文件和你的应用程序一起发行,或者定位一个目标计算机上已经存在的连结文件,并且把你的连结加上去。另一种可选的方法是设置SQLConnection组件的DriverName属性。包含DriverName的下拉列表列出了你在系统中已经安装的所有驱动程序。驱动程序的信息被包含在 dbxdrivers.conf文件中。
设置DriverName属性,也就会根据驱动程序文件中的信息设置LibraryName和VendorLib属性。LibraryName包含了dbExpress驱动程序共享对象文件的名称。VendorLib包含了数据库厂商的客户库文件名字。
如果在连结编辑器中为 SQLConnection 组件的 Params属性输入连结参数,连结信息就完全被包含在你的应用程序中。如果你希望应用程序的用户能更改你存储的任何连结参数,你可以把它们存储在应用程序自己的配置文件中,并且提供一种方法编辑文件,可以在你的应用程序中,或者是一个单独的配置程序;这就使每个应用程序完全是自包含的。
SQLConnection组件也提供了StartTransaction,Commit和Rollback方法用于事务控制。如果你需要执行SQL语句,但不需要返回一个结果集,你就可以使用SQLConnection组件的Execute或ExecuteDirect方法,而不需要任何dataset组件。 如果你需要访问数据库的metadata,可以使用SQLConnection组件的GetTableNames, GetFieldNames和GetIndexNames方法。
2、Dataset组件
dbExpress提供了四个dataset组件,SQLDataSet,SQLQuery,SQLStoredProc和SQLTable。
SQLDataSet可用于任何新的应用程序。通过设置它的CommandType属性,你可以用来执行SQL语句,调用一个存储过程,或者,访问数据表中所有的行和列。另外的dataset组件主要用于把使用Borland数据库引擎的Windows应用程序很容易地转换成dbExpress。
为了使用一个SQLDataSet,设置它的SQLConnection属性为你所要使用的SQLConnection组件,然后把它的CommandType属性设置为ctQuery, ctStoredProc 或 ctTable。通常,你使用缺省的值为ctQuery。CommandText属性值依赖于CommandType的值。如果CommandType是 ctQuery, CommandText就包含你想要执行的SQL语句。如果CommandType是ctStoredProc,CommandText就是存储过程的名称。如果CommandType是ctTable,那么,CommandText 就是数据表的名字。你可以使用Params属性为参数化的查询或存储过程提供参数,使用DataSource属性把SQLDataSet和另外一个主-从关系的dataset组件相连。
SQLDataSet仅提供只读的单向游标。如果这是你惟一的访问要求,如,打印一个报表,你就可以直接使用SQLDataSet,或者根据你的报告工具使用一个DataSource组件。如果你要对数据记录进行编辑,就要增加一个DataSetProvider和ClientDataSet,如前面所述。如果你需要详细的metadata信息,就要使用一个SQLDataSet 的SetSchemaInfo方法。SetSchemaInfo有三个参数,分别是SchemaType,SchemaObject和SchemaPattern。 SchemaType可以是stNone,stTables,stSysTables,stProcedures,stColumns,stProcedureParams或stIndexes。该参数表明SQLDataSet被打开时所包含的信息类型。当你使用一个SQL语句或存储过程从一个数据表中获取数据时,SchemaType被设置为stNone。其它的schema类型创建一个拥有相应的结构的dataset。当请求一个存储过程或数据表名字时,SchemaObject就是存储过程或数据表的名字。Schema模式可以让你对结果进行过滤。例如,如果SchemaType是stTables ,SchemaPattern是'EMP%',那么返回的数据集将仅仅返回以EMP开头的数据表。
3、SQLMonitor
最后一个dbExpress组件是SQLMonitor,用于帮助你调试你的应用程序。SQLMonitor用来监视在一个SQLConnection组件和相联的数据库服务器之间流动的所有的SQL语句。SQL语句可以被记录到日志文件中,或者你可以书写事件句柄处理它们。
4、数据访问组件
DataSetProvider
一个DataSetProvider是通过其DataSet属性被连结到一个dbExpress dataset组件上去的。DataSetProvider根据请求为ClientDataSet提供数据,产生SQL DML语句,根据ClientDataSet提供的更改日志对数据库作更改。
ClientDataSet
ClientDataSet是通过它的ProviderName属性和一个DataSetProvider相连的。它从它的DataSetProvider获得数据,把数据缓存在内存中,把所有的数据更改做成日志,当ClientDataSet的ApplyUpdates方法被调用时,把更改日志发送给DataSetProvider。
DataSource
一个DataSource组件是通过它的DataSet属性和一个dataset相连的。Dataset可以是一个ClientDataSet或者是dbExpress dataset组件之一。DataSource提供公共函数功能,以及数据感应用户界面组件的连结点。它也用于连结数据集组件,以模拟一对多、多对多的关系。
SQLClientDataSet
ClientDataSet这是一个具有内建DataSetProvider和SQLDataSet的ClientDataSet组件。仅仅要把它和一个SQLConnection组件相连;设置DataSet,CommandType和CommandText属性。当SQLClientDataSet隐藏掉很少用到的SQLDataSet、 DataSetProvider组件的某些性能,访问来自一个单一数据表的数据时,它将能节省时间,并且提供你通常所要用到的所有的功能。
另外,MyBase是一种本地的XML数据库。包含在一个 ClientDataSet中的数据,可以二进制或XML格式被存储在磁盘文件或被调用。这可以使一个ClientDataSet 如同一个单一用户的关系数据库系统。惟一的限制就是当它被访问时它必须适合内存的大小。这种性能可以被运用于许多方面。你可以使用 ClientDataSet在内存中创建临时数据表,也可以瞬时去除它。