[转载]UNIDAC用法总结

常言道,细微之处见体贴。UniDAC有一些过人的方法或属性。
比如,刷新单条记录(RefreshRecord)、多表更新的属性(UpdatingTable)、宏替换参数(Macros)、
集成删除/新增/修改/刷新/锁定SQL语句、FetchRows,更让人称道的是引入了UpdateSQL组件。

TUniTable、TUniQuery和TUniStoredProc是用来检索和编辑数据的UniDAC控件.

***************************TUniQuery******************************************************

UniDirectional属性

ADO没有单向数据集特性,所有的数据下载到本地,不停的开辟内存或释放大内存,对三层的内存是一个极大考验。TUniQuery有一个 UniDirectional属性,支持单向速度,这点和DBX的想法不谋而合。况且,单向数据集特性速度非常快,在三层中,配合 TDataSetProvider,中间件将其Data包发送到客户端,速度无可比拟。ADO也有流或XML格式包,但无论是XML或流格式,数据包远比 CDS的包大几倍。CDS封包技术很好!

 

FetchRows可以设定一次获取记录的行数

uniquery 和 unitable 的 SpecificOptions 属性,需要设置 FetchAll=False才能使 FetchRows 的设置生效,而默认情况下, oracle 是设置Oracle.FetchAll=False;
而对去 sql server 和 mysql 等,却是设置的 XXX.FetchAll=True 
UniQuery.SpecificOptions.Values[‘FetchAll’] := BoolToStr(cbFetchAll.Checked, True);

UniDirectional属性

ADO没有单向数据集特性,所有的数据下载到本地,不停的开辟内存或释放大内存,对三层的内存是一个极大考验。TUniQuery有一个 UniDirectional属性,支持单向速度,这点和DBX的想法不谋而合。况且,单向数据集特性速度非常快,在三层中,配合 TDataSetProvider,中间件将其Data包发送到客户端,速度无可比拟。ADO也有流或XML格式包,但无论是XML或流格式,数据包远比 CDS的包大几倍。CDS封包技术很好!

UniDAC的单条记录刷新
1、设置 SQLRefresh.TEXT的刷新SQL,一般要具体到单条记录。比如:SQLRefresh.Text:='SELECT * FROM TName WHERE ID = :ID'(其中ID是表TName的主键,以确保返回只有一条记录)
2、设置 TRefreshOptions为 [roAfterInsert,roAfterUpdate],即为新增后刷新,修改后刷新。
3、调用 UniQuery1.RefreshRecord
如果不做以上设置,仅执行UniQuery1.RefreshRecord 是一点反映也没有的

UpdatingTable
属性 UpdatingTable 服务显示表将被更新(如果在查询中有许多表)。如果它的值为空,正在使用的表就会显示SQL操作的结果。 为了更好地对查询结果进行操作,建议应总是设置属性UpdatingTable

cachedupdates缓存更新
UniQuery默认状态为行提交,使用前根据需要设置readonly或cachedupdates属性

Filter过滤
UniQuery.Filter默认大小写区分,请注意设置FilterOptions属性([foCaseInsensitive]),TVirtualtable也存在相同情况

在UniQuery的SQL定义参数
我们经常会在UniQuery的SQL定义一些参数,在传参时,需要特别注意,例如:
QExec.Close;
QExec.SQL.Text:= ‘select * from YHB where sYHBH=_YHBH’;
在传参时有两种写法
1)最稳妥的写法
QExec. ParamByName(‘P_YHBH’).DataType:= ftString;
QExec. ParamByName(‘P_YHBH’).ParamType:= ptInPut;
QExec. ParamByName(‘P_YHBH’).AsString:= ‘张三’;(此处可将AsString换成Value)
2)下面这个写法我做了简单测试,也是可以的,但对复杂的SQL传参是否正确,未知
QExec. ParamByName(‘P_YHBH’).AsString:= ‘张三’;(在不对参数的数据类型和传入传出类型进行指定的情况下,绝对不能使用Value)

UniQuery.SetReadOnly属性
1) 我们经常会用到多表关联,且需要在前台修改数据。举个例子:a表和b表,在前台两个表字段都需要修改,则需要将SetReadOnly设置成false
2)特别注意:若将一个UniQuery.SetReadOnly设置成true,而这个表有一个自增长ID,那么你在提交数据时会出错,跟踪SQL会发现,ID被前台前行传了一个null值

UniQuery. RefreshRecord

可以刷新当前选择的数据

数据提交

数据提交的顺序,一定要注意:

   with MyQuery do
   begin
      Session.StartTransaction;
      try
         … {Modify data}
         ApplyUpdates; {try to write the updates to the database}
         Session.Commit; {on success, commit the changes}
      except
         RestoreUpdates; {restore update result for applied records}
         Session.Rollback; {on failure, undo the changes}
         raise; {raise the exception to prevent a call to CommitUpdates!}
      end;
      CommitUpdates; {on success, clear the cache}
end;
对于单数据集的提交:
MyQuery. ApplyUpdates;
MyQuery. CommitUpdates;

Unidac:解决“trying to modify read-only Field”问题!
后台使用SQL语句中,经常会关联自定义函数或视图,而CDS(TClientDataSet)对字段校验比较严格,涉及到的自定义函数或视图输出的字段,都会强制改为ReadOnly为True属性。
当后台使用UniDAC+CDS,关联视图或自定义函数,为了数据一致性,有可能需要在前台界面上修改CDS相关的自定义函数输出的字段,即便是将 该字段设置为 readonly为false,

或将其字段的 FieldDefs属性的attributes的faReadOnly去掉,系统也会抛出一个异常:trying to modify read-only Field。
解决问题很简单,将TUniQuery.Options.SetFieldsReadOnly为false即可。
查一下TUniQuery.Options.SetFieldsReadOnly的帮助,这样写道:
If True, dataset sets the ReadOnly property to True for all fields that do not belong to UpdatingTable or can not be updated. Set this option for datasets
that use automatic generation of the update SQL statements only.

Macros属性

要注意:如果要替换的值是一个字符串,那么记得在字符串两边加''号,因为Macro只是一个简单的替换功能,他不会去判断条件的类型。

其他

UniQuery默认情况下,有些varchar类型的字段有自动加了一个空格,请注意设置Options.TrimVarChar=true
UniQuery在进行Insert时,若字段不能为null且前台操作未填写时,可能会报错,请设置RequiredFields=true
UniQuery在修改数据集时,默认的方式是按关键字生成SQL语句进行数据提交。还有另外两种方式:一是设置updateSQL,一是设置KeyFields(具体请sql跟踪查看)
UniQuery的数据排序属性是IndexFieldNames
 

********************存储过程*************************************************************************

TUniConnection, TUniSQL, TUniQuery, TUniStoredProc均可以执行存储过程。

TUniConnection:

是一种最简单的执行存储过程的控件,但他有很多限制。TUniConnection不能具有SQL、存储过程名和参数,不支持输出参数也不支持存储执行的预准备。当然,如果只是运行一个既没有返回也没有输出参数设置,那TUniConnection是一个不错的选择。

TUniSQL:TUniSQL是一个被分离出的小控件,执行SQL语句但不返回结果集。它没有数据存储,但要消耗一些内存,但比TUniQuery和TUniStoredProc的执行速度快。

UniSQL.SQL.Text :=str
 UniSQL.Execute;
 s := 'Rows affected: ' + IntToStr(UniSQL.RowsAffected);

 

TUniQuery:TUniQuery除具有TUniSQL的执行功能外,还能返回结果集。

TUniStoredProc:TUniStoredProc是专门用来执行存储过程的一个控件,可以返回结果集、输出参数、执行准备以及通过CreateProcCall方法初始化等。

1、 参数类型

UniDAC支持四种参数类型:input, output, input/output, result

***********************************************TUniConnection************************************************************

事务

TUniConnection通过StartTransaction, Commit, Rollback等方法来控制本地事务,判断一个事务是否开启用InTransaction。

1、TUniConnection

建立和控件数据连接的控件,能访问的数据库包括:Oracle, SQL Server, MySQL, InterBase, Firebird, 和PostgreSQL.

虽然UniDAC对不同的数据库提供了统一的访问接口,但是对个别数据库还是要进行一些特殊的设置,这些设置是一个字符串列表,你可以按以下代码进行设置:

UniConnection.SpecificOptions.Values[‘CharLength’] := '1';

1、 Oracle

分享到: