UniDAC使⽤教程(⼆):数据更新
是⼀款通⽤数据库访问组件,提供了多个数据库的直接访问,如针对Windows的Delphi, C++Builder, Lazarus (以及 Free Pascal) , Mac OS X, iOS, Android, Linux和64和32位的FreeBSD等等。我们将长期的经验集于这个⼩组件,提供统⼀的数据库连接访问(如oracle、微软SQL等等)。这意味着您可以在您的项⽬之间轻松地切换不同的数据库,以及创建跨数据库应⽤程序接⼝。
本篇⽂章介绍使⽤UniDAC数据集组件进⾏数据编辑的常⽤⽅法。
⾃动数据更新
数据更新的扩展设置
缓存更新
默认值/表达式
⾃动增量值⽣成
及时获取最新数据
⾃动数据更新
TUniTable, TUniQuery和TUniStoredProc是允许检索和编辑数据的UniDAC组件。要编辑每个组件的数据,请在KeyFields属性中指定键字段名称。如果KeyFields为空字符串,则Oracle、PostgreSQL、Interbase、SQLite和所有基于ODBC的提供程序都将尝试从发送附加查询的服务器请求有关主键的信息(这可能会对性能产⽣负⾯影响)。SQL Server和MySQL提供程序将使⽤服务器发送的元信息和数据。SQL Server提供程序具有UniqueRecords选项,该选项允许在查询中省略主键字段时⾃动从表中请求主键字段。
如果要打开的数据集没有唯⼀标识记录的字段,则可以通过服务器的⽅式通过Oracle、Firebird 2.0、PostgreSQL和SQLite服务器来解决这个问题。对于Oracle和SQLite服务器,您应该将RowID列添加到查询中。带Firebird 2.0 - DB_KEY。如果您的表是使⽤OID创建的,那么可以使⽤PostgreSQL服务器OID列作为关键字字段。
数据更新的扩展设置
对于具有来⾃多个表的数据的数据集,默认情况下只有⼀个表是可更新的。您应该在UpdatingTable属性中指定要更新的表名,否则属于字段列表中第⼀个字段的表将是可更新的。如果SetFieldsReadOnly选项设置为True(默认情况下),则⾃动⽣成的更新SQL语句中未使⽤的字段将标记为只读。对于复
杂查询(使⽤多个表、同义词、dblinks、聚合字段的语句),我们建议使⽤Oracle、PostgreSQL和所有基于ODBC的提供程序启⽤ ExtendedFieldsInfo 选项。
如果插⼊/发布、更新或刷新记录操作影响了多个记录,UniDAC将引发异常。要禁⽌此类异常,应将StrictUpdate选项设置为False。
为了更灵活地控制数据修改,可以填充update-SQL语句。它们由SQLInsert、SQLUpdate、SQLDelete和SQLRefresh 属性表⽰,并在Insert/Post、Edit/Post、Delete和Refresh操作中⾃动执⾏。在设计时,可以在组件编辑器的“SQL Generator”选项卡上⽣成默认的更新SQL语句。可以根据需要修改⽣成的语句。但是,如果为每个记录动态⽣成更新查询,则只有更改后的值才会发送到服务器。
对于某些特定情况,此功能不够。它可以通过TUniUpdateSQL组件进⾏扩展。TUniUpdateSQL允许为每个更新操作关联⼀个单独的TUniSQL/TUniQuery/TUniStoredProc组件。
缓存更新
UniDAC允许在客户端缓存更新(所谓的“Cashed Updates”),然后批量发布所有更新。这意味着在调⽤Post或Delete之后,更改不会⽴即反映在服务器上。调⽤ApplyUpdates⽅法后,所有缓存的更改都将发布到服务器。UpdateBatchSize选项允许设置要同时发布的更改数。
默认值/表达式
如果已经为数据库表中的列定义了默认值或表达式,则可以设置UniDAC,以便它从服务器请求这些表达式。这些表达式将分配给TField对象的DefaultExpression 属性。如果已填充默认表达式值,则将替换这些值。此⾏为由默认值选项控制,默认情况下禁⽤该选项。
⾃动增量值⽣成
编辑数据集时,通常不⽅便⼿动填充关键字字段值,⽽是⾃动⽣成它们。有三种⽅法可以做到。
第⼀种⽅法,最有⽤的⽅法,是使⽤服务器⽅法⾃动⽣成关键字字段值。
SQL Server、MySQL和SQLite允许在表中定义⾃动增量列。这不需要在客户机上进⾏额外的处理。对于SAP Sybase ASE、Oracle、PostgreSQL和Interbase提供程序,需要指定特定于keysequence(Interbase的KeyGenerator)的选项。⾃动⽣成的值⾃动反映在数据集中。
第⼆种⽅法是在BeforePost事件处理程序中⽣成并填充关键字字段值。通常,这种⽅式需要执⾏查询以从服务器检索⼀些信息。所以这种⽅法可能只在某些特定的情况下有⽤。
第三种⽅法是创建AFTER INSERT触发器,⽤适当的值填充字段。但返回触发器⽣成的值时出现问题。
尽管这个问题可以解决(见下⼀段),但这种⽅法被认为是⾮最优的。因此,如果可能,尝试选择另⼀种⽅法。批量更新sql语句
但是,可以使⽤特定于QueryIdentity的选项为SQL Server提供程序禁⽤检索⽣成的值。这将提⾼记录插⼊的性能。
及时获取最新数据
在某些情况下,UniDAC允许⾃动刷新数据集中的记录,以使其值保持最新。
使⽤刷新选项,您可以在编辑前、插⼊或删除后使UniDAC刷新当前记录。它是通过执⾏⼀个附加的查询来完成的。
DMLRefresh选项允许在插⼊或更新后刷新当前记录,与RefreshOptions类似,但其⼯作⽅式不同。这允许实现⽐刷新选项更⾼的性能。基于MySQL、SQLite和ODBC的提供程序不⽀持DMLRefresh。
如果要控制插⼊或更新后需要刷新当前记录的哪些字段,应执⾏以下操作:在更新查询中定义与数据集中字段名称对应的名称的输出参数,并将ReturnParams选项设置为
True。执⾏更新查询后,数据集读取输出参数的值,并将其放⼊具有相应名称的字段中。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论