FetchDetail发生错误? ( 积分: 100 )

  • 主题发起人 主题发起人 WilliamGui
  • 开始时间 开始时间
W

WilliamGui

Unregistered / Unconfirmed
GUEST, unregistred user!
开发环境: Delphi7+Patch2+数据库组件更新
主从表新增保存到后台后,执行FetchDetail(新增的记录),发生如下错误提示:
Record not found or changed by another user.
跟踪发现,Delphi内部有段代码在Delta中找记录没有找到发生这个错误,
我就不明白了?!
 
开发环境: Delphi7+Patch2+数据库组件更新
主从表新增保存到后台后,执行FetchDetail(新增的记录),发生如下错误提示:
Record not found or changed by another user.
跟踪发现,Delphi内部有段代码在Delta中找记录没有找到发生这个错误,
我就不明白了?!
 
我想很多同行都想要知道,在此分享一下我的经验,以下是开发记录:
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语句,
虽然本地是最新的数据;
以上为重要的注意内容;
 
后退
顶部