ApplyUpdates 问题,如有更好方法我给300分? (sql7+ADOdataset+ClientDataSet)(10分)

  • 主题发起人 主题发起人 netkk
  • 开始时间 开始时间
N

netkk

Unregistered / Unconfirmed
GUEST, unregistred user!
我用sql7,Adodataset和clientdataset 做的三层,
更新数据时(applyupdates)有如下问题:
因为多用户更新数据库中的记录,TdataSetProvider 的updatemode 须设为
upWhereKeyOnly,但如果只改动这个值,更新会出现错误:
Unable to find record. No key specified.
后来我在TdataSetProvider的 Onupdatedata 事件中将有需要的字段的
Providerflag 中加入 pfInKey 问题就解决了。
但我总觉得应该还有更好的方法解决这个问题,如自动找到数据表的主关键索引,
然后自动更新, 另外, 由于SQL Moniter 不能跟踪控件产生的sql语句,
并不能掌握前面更新数据时的内部行为。
如果谁能提供更好的指引或例子, 我再提供300分。
 
对于一般的应用将 Updatemode 设为 upWhereKeyOnly 比较方便,但有些特殊的应用
还是采用默认值比较好。
以下假设 Updatemode := upWhereKeyOnly 时的解决办法:
1、对于静态ADODataSet,可以通过字段编辑器根据需要在字段的ProviderFlags中
包含[pfInKey]即可。
2、对于动态ADODataSet,当服务器端的ADODataSet打开后,立即设置某些字段的
ProviderFlags := ProviderFlags + [pfInKey];
 
将所有的数据更新用存储过程调用。
 
你这个问题简单,你做一个继承自TDATASETPROVIDER的控件,OVERRIDE父类的
APPLYUPDATES方法,在其中将KEYFIELDS的PROVIDERFLAGS加上pfInKEY即可。
你就不用每个TDATASETPROVIDER加这些代码了。
这个问题是TCLIENTDATASET的DELTA数据包错误。DELPHI4就错,没想到DELPHI5
还是错。
 
我做过类似这样的程序,我是这样做的:
因为可能有多人同时访问一个表,并且可能同时更新同一个记录,所以我采用存储过程来
完成。设计思想是:sql Server7 table1用户先查询到相关记录,再作出选择,一旦确认
则将该记录从表table1中删除,并存入另一张表TABLE2中,
Create Procudure demo
( @name varchar(10),@total decimal(10,2),@out int OUTPUT)
as
select @out=count(*) from table1 where name=@name
if @out > 0
begin
insert into table2 (name,total) values(@name,@total)
delete table1 where name=@name
return @out
end
else
return 0
而在应用程序服务器不需要格外的设定。客户端不用ApplyUpdates都可以的,有兴趣的话
欢迎联系。这个系统已经运行了半年了,数据量有10万多记录都没什么问题。
 
to zenger:
//将该记录从表table1中删除,并存入另一张表TABLE2中
为什么?连记录更改都要这样做吗?
 
ADOdataset我没用过,我用query,动态更改.(ClientDataSet-->
commandText:=true).有多人同时访问一个表,并且可能同时更新同一个记录,
用多台APPserver时有问题.
zengr的方法好.
 
接受答案了.
 
后退
顶部