adoquery保存数据时的问题??? ( 积分: 20 )

  • 主题发起人 主题发起人 zgjob
  • 开始时间 开始时间
Z

zgjob

Unregistered / Unconfirmed
GUEST, unregistred user!
我的一个数据保存程序如下,新插入的数据存入表1后再更新表2,数据量较大,有时会出现重复执行的问题,请问如何改进?<br>with&nbsp;adoq1&nbsp;do<br>begin<br>&nbsp;&nbsp;close;<br>&nbsp;&nbsp;sql.clear;<br>&nbsp;&nbsp;sql.add('select&nbsp;yid,数量&nbsp;from&nbsp;表1');<br>&nbsp;&nbsp;open;<br>&nbsp;&nbsp;first;<br>&nbsp;&nbsp;for&nbsp;i:=0&nbsp;to&nbsp;recordcount-1&nbsp;do<br>&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;adoq2&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql.clear;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql.add('update&nbsp;表2&nbsp;set&nbsp;数量=数量-:sl&nbsp;where&nbsp;yid=:yid');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Parameters.ParamByName('yid').Value:=adoq1.Fields[0].AsInteger;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Parameters.ParamByName('sl').Value:=adoq1.Fields[1].Asfloat;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;execsql;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;{with&nbsp;adoq2}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;adoq1.next;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;end;{for}<br>adoq1.close;<br>end;{with&nbsp;adoq1}<br>程序运行基本上都正常,但出现过几次,数据重复执行了比如yid为了22的商品本身应减数量为5但运行后却减了两次即10的现象,请问如何改进?或者有何好办法??
 
感覺僅僅用更新語句update&nbsp;表2&nbsp;set&nbsp;数量=数量-:sl&nbsp;where&nbsp;yid=:yid,就可以了,不需要這樣的
 
直接用&nbsp;sql&nbsp;语句进行处理啊,不要把数据库里的记录全部查询出来。<br><br>如果你这个表有&nbsp;1千万的记录,那不得死菜?
 
不太清楚表1的结构。<br>不过根据你的例子来看,说明yid为22的商品在表1中可能有两条记录或者你的第一个查询语句查出来的结果有两条记录。所以要确定表1的主键是不是只有yid。
 
create&nbsp;@ta&nbsp;Table(id&nbsp;int,Amount&nbsp;int)<br>create&nbsp;@tb&nbsp;Table(id&nbsp;int,Amount&nbsp;int)<br><br>update&nbsp;@tb&nbsp;<br>set&nbsp;Amount&nbsp;=&nbsp;Amount&nbsp;-&nbsp;isnull(A.Amount,0)<br>from&nbsp;@tb&nbsp;as&nbsp;B<br>&nbsp;&nbsp;&nbsp;&nbsp;left&nbsp;outer&nbsp;join&nbsp;@ta&nbsp;as&nbsp;A&nbsp;on&nbsp;A.id=B.id<br>where&nbsp;A.id&nbsp;is&nbsp;not&nbsp;null<br><br>足以!
 
我覺得你弄用存儲過程來處理要好些,<br>主要的几步就是你先把把表1按yid匯總至一個臨時表中,然后再用臨時表中的數據去更新表2中的內容<br>select&nbsp;fid,sum(數量)&nbsp;as&nbsp;數量&nbsp;into&nbsp;#temp&nbsp;from&nbsp;表1&nbsp;group&nbsp;by&nbsp;fid<br>------------------------<br>update&nbsp;表2&nbsp;set&nbsp;表2.數量=表2.數量-#temp.數量&nbsp;&nbsp;from&nbsp;&nbsp;#temp<br>where&nbsp;表2.yid=#temp.yid<br>-------------------------------
 
嗯,楼上的同意<br>试试楼上的方法,帮助提高SQL水平,<br><br>---------个人宣言:坚决不刷分-------------<br>注册了三年,还是250分,真是没得说<br>所以发愤赚点分,如果可以多给点分,我要分!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
后退
顶部