主从表缓存保存出错,问题很怪请高手指点(100分)

  • 主题发起人 主题发起人 ygzymw
  • 开始时间 开始时间
Y

ygzymw

Unregistered / Unconfirmed
GUEST, unregistred user!
保存代码如下,如果从表在保存时有重复键报错错,则修改从表再点保存,结果主表没有保存,从表保存上了,这是为什么呀??delphi7+sqlserver2000<br>procedure Tfrmcomdj.aSaveExecute(Sender: TObject);<br>begin<br> &nbsp; screen.Cursor:=crhourglass;<br> &nbsp; if dnlook.DataSource.DataSet.State in [dsinsert,dsedit] then<br> &nbsp; &nbsp; dnlook.DataSource.DataSet.Post;//主表<br> &nbsp; if dbgrid1.DataSource.DataSet.State in [dsinsert,dsedit] then<br> &nbsp; &nbsp; dbgrid1.DataSource.DataSet.post;//从表<br> &nbsp;if not DM.ADOConnection1.InTransaction then<br> &nbsp;begin<br> &nbsp; &nbsp;try<br> &nbsp; &nbsp; &nbsp;dm.ADOConnection1.BeginTrans;<br> &nbsp; &nbsp; &nbsp;(dnlook.DataSource.DataSet as tadoquery).UpdateBatch;//主表<br> &nbsp; &nbsp; &nbsp;(dbgrid1.DataSource.DataSet as tadoquery).UpdateBatch;//从表<br> &nbsp; &nbsp; &nbsp;dm.ADOConnection1.CommitTrans;<br> &nbsp; &nbsp; &nbsp;screen.Cursor:=crdefault;<br> &nbsp; &nbsp; &nbsp;CanSave := False;<br> &nbsp; &nbsp; &nbsp;//IniRecord;<br> &nbsp; &nbsp;except<br> &nbsp; &nbsp; &nbsp;on e: exception do<br> &nbsp; &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp; &nbsp;application.MessageBox(pchar('&Ecirc;&yacute;&frac34;&Yacute;±&pound;&acute;&aelig;&Ecirc;§°&Uuml;'+e.Message),'&acute;í&Icirc;ó&Igrave;á&Ecirc;&frac34;',mb_ok+mb_iconerror);<br> &nbsp; &nbsp; &nbsp; &nbsp;dm.ADOConnection1.RollbackTrans;<br> &nbsp; &nbsp; &nbsp; &nbsp;screen.Cursor:=crdefault;<br> &nbsp; &nbsp; &nbsp; &nbsp;raise;<br> &nbsp; &nbsp; &nbsp; &nbsp;//dm.ADOConnection1.Cancel;<br><br> &nbsp; &nbsp; &nbsp;end<br> &nbsp; else<br> &nbsp; &nbsp; Application.MessageBox('·&thorn;&Icirc;&ntilde;&AElig;÷&Atilde;&brvbar;&Ccedil;&euml;&Eacute;&Ocirc;&ordm;ó&Ocirc;&Ugrave;&Ecirc;&Ocirc;&pound;&iexcl;','&acute;í&Icirc;ó&Igrave;á&Ecirc;&frac34;',MB_OK+mb_iconWarning);<br> &nbsp; end;<br> &nbsp; end;<br> &nbsp; screen.Cursor:=crdefault;<br> end;
 
高手帮忙看一下吧
 
是不是我说得不够清楚,也就是保存时从表有键值违反主键约束,然后修改从表的值,再点保存按钮,就会发生从表保存了,点刷新时看到主表没保存.
 
这是因为你第一次主表已经post成功了:dnlook.DataSource.DataSet.Post;//主表<br>而第二次执行时这条语名将不成立:if dnlook.DataSource.DataSet.State in [dsinsert,dsedit] then<br>所以缓存更新时系统没有把主表的记录当成是新增或修改状态.
 
首先谢谢zxmxr老兄,第二次是没有再POST,但是我写在一个事务里, (dnlook.DataSource.DataSet as tadoquery).UpdateBatch;//主表<br> &nbsp; &nbsp; &nbsp;(dbgrid1.DataSource.DataSet as tadoquery).UpdateBatch;//从表<br>应该是同时执行的,既然上次已经POST了,第二次保存前只修改了从表,应该把主表的数据也提交到数据库呀,可是没有,如果再修改一下主表再保存就会提示无法定位行,结果已更改.但是正常保存时,主从表保存没问题.
 
保存的时候应该先保存从表,然后再保存主表吧
 
主表保存之前先对从表进行检测,如果从表不符合保存条件则主从表都不能保存,这样保存<br>应该是不会出现你这种情况的
 
后退
顶部