我想很多同行都想要知道,在此分享一下我的经验,以下是开发记录:
QQ:4980688 e-mail:williamgui@e-erpchina.com
---------------------------------------------------------------
TfrmBasGenDataFrm基类
使用本地TDataSetProvider与TClientDataSet、FetchDetail结合的方式操作数据;
用户继承的窗口界面,
需增加如adsPerson、dspPerson、cdsPerson等数据集控件(可以主从表结构);
----------------
其中重要属性设置:
ADO数据集:
CacheSize=1;
CursorLocation=clUseClient;
CursorType=ctStatic;
LockType=ltOptimistic;
字段对象需设置KeyField;
Provider:
ptions=[poCascadeDelete,poCascadeUpdate,
poAllowMultiRecord,poAllowCommand];
ResolveToDataSet=True;
UpdateMode=upWhereKeyOnly;
ClientDataSet:
字段对象需设置KeyField;
(注: 在TfrmBasGenDataFrm基类会自行首先打开ADO及Cds数据集);
----------------
如果Provider.ResolveToDataSet=false则由Provider产生SQL语句更新数据库,
当新增数据记录并定位,再次FetchDetail,
此时若ADO是打开的,且ADO的LockType=ltBatchOptimistic,
则ADO中当然没有新加的记录,FetchDetail就会出现:
"Record not found or changed by another user."错误提示
(跟踪Delphi内部代码,发现Delphi需要定位主表记录,
并FetchDetail从表,而主表无法定位),
如果ADO没有打开或LockType=ltOptimistic,
Delphi就会很聪明的,也是不必要的再次向数据库Select一次主表数据;
所以,Provider.ResolveToDataSet应该等于true,
此时由ADODataSet去产生SQL更新数据库
(因此TfrmBasGenDataFrm基类FormCreate时ADO应该打开),
当然用户新增的记录也会在ADODataSet中,
不过,ADO的LockType不应该等于ltBatchOptimistic,
为什么?因为没有执行UpdateBatch,
当然ADO就不会向后端数据库发送任何SQL语句,
虽然本地是最新的数据;
以上为重要的注意内容;