修改、插入等操作如果只执行其中一种正常,如果组合操作则出错 (100分)

  • 主题发起人 主题发起人 QY208
  • 开始时间 开始时间
Q

QY208

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟正在写C/S程序(delphi6+SQL2000),我用了TUpdateSql来更新数据
如下代码只对单表执行保存数据的操作
(说明:TTQuery的CachedUpdate=true,Requestlive:=false)
保存按钮的程序代码如下:
DbLogin.StartTransaction;
try
database1.ApplyUpdates; {try to write the updates to the database};
DbLogin.Commit; {on success, commit the changes};
except
DbLogin.Rollback; {on failure, undo the changes};
raise; {raise the exception to prevent a call to CommitUpdates!}
end;
CommitUpdates;
一个奇怪的现象是:在Dbgrid里修改、插入、删除等操作如果只执行其中一种,保存按钮工作
正常,如果组合操作(比如先修改数据,接着插入数据),点保存按钮则出错,程序仿佛进入
死循环,只好强制结束
 
你在两个操作中间试着刷新一次,看是否还会出错
 
to 沙隆巴斯的主人:
我用的是dbgrid来操作数据的,保存数据的按钮的代码在上述代码中,
我不知道如何在两个操作中间试着刷新一次,请教
 
在两条sql语句中间使用刷新.
tquery.update
tquery.refresh;//刷新数据.
tquery.insert.
 
Requestlive必须为True
 
to Yujx:
RequestLive=false时运行的也很正常的,因为我用了TUpdateSql来更新数据,
我百思不得其解的是:为什么在Dbgrid里同时做修改和插入操作,当我点保存按钮时
程序死掉[?]
to hbezwwl:
我用了TUpdateSql来更新数据,请问你说的SQL语句应加在哪?
 
一般来说不对Database 进行频繁的更新,提交
你可以进行表级更新,写在table,query 的onafterpost事件或onafterdelete 事件里
 
to liusm:
这好办,把database改为tquery即可,只是你并未告诉我如何
对dbgrid实现上述操作,特别是用Query的applyupdates
请重新再审题好吗?
 
我正遇到这种同样的问题,能不能将你的你的方案给我。
haloon@21cn.com
我用的是ADOSTOREDPROC,ADODATASET访问SQL中的STOREDPROC都一样出错。
谢了。
 
看看TUpdateSql的属性,那三个SQL语句。
 
to softboy:
看了,不是三个sql的问题
 
自己发现解决办法了,希望能对有同样问题的朋友提供参考
我的解决办法是:将事务语句删除,仅仅保留try语句,即:
DbLogin.StartTransaction;{此句删除}
try
database1.ApplyUpdates; {try to write the updates to the database};
DbLogin.Commit;{此句删除}
except
DbLogin.Rollback; ;{此句删除}
raise; {raise the exception to prevent a call to CommitUpdates!}
end;
CommitUpdates;
问题的原因我想是出自DELPHI本身的机制,ApplyUpdates本身即是一个二层的
事务处理,当我们再加事务处理在其上,变成三层事务处理了,执行单独操作
可能没有问题,当执行组合操作时,可能发生多层事务处理交叉,进入死循环。
以上见解纯属猜测,让行家贻笑大方了
 
多人接受答案了。
 
后退
顶部