起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 276|回复: 11

为什么程序在执行下列sql语句时出现假死状态?

[复制链接]
发表于 2009-9-18 15:01:37 | 显示全部楼层 |阅读模式
为什么程序在执行下列sql语句时出现假死状态?
                                   DataSetBrokerASSESS_EMPLOYEE_SCORE.DataSet.First;
                                   for i:=0 to DataSetBrokerASSESS_EMPLOYEE_SCORE.DataSet.RecordCount-1 do
                                   begin
                                        DataSetBrokerJOB_ASSESS_PROJECT.DataSet.First;
                                        for j:=0 to DataSetBrokerJOB_ASSESS_PROJECT.DataSet.RecordCount-1 do
                                        begin
                                             if DataSetBrokerASSESS_EMPLOYEE_SCORE.DataSet.FieldByName('PROJ_NO').AsString = DataSetBrokerJOB_ASSESS_PROJECT.DataSet.FieldByName('PROJ_NO').AsString then
                                             begin
                                                  break;
                                             end;
                                             if j=DataSetBrokerJOB_ASSESS_PROJECT.DataSet.RecordCount-1 then
                                             begin
                                                  sQuery.Close;
                                                  sQuery.CommandText:='UPDATE ASSESS_EMPLOYEE_SCORE AES SET AES.STATUS=0 WHERE AES.USERID='+DataSetBrokerASSESS_EMPLOYEE_SCORE.DataSet.FieldByName('USERID').AsString+' AND AES.BONUS_IN='+DataSetBrokerASSESS_EMPLOYEE_SCORE.DataSet.FieldByName('BONUS_IN').AsString+' AND AES.PROJ_NO='+DataSetBrokerASSESS_EMPLOYEE_SCORE.DataSet.FieldByName('PROJ_NO').AsString;
                                                  sQuery.Execute;
                                             end;
                                             DataSetBrokerJOB_ASSESS_PROJECT.DataSet.Next;
                                        end;
                                        DataSetBrokerASSESS_EMPLOYEE_SCORE.DataSet.Next;
                                   end;

当执行sQuery。Execute的时候 就挂了 过了一会儿 报 超时错误!
这么原因? 高手指教? :afro:
回复

使用道具 举报

发表于 2009-9-18 15:26:11 | 显示全部楼层
楼主,你这段代码效率很低。
数据集做循环时,加上DisableControls和EnableControls。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-18 15:44:04 | 显示全部楼层
难道是这个问题吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-18 15:50:10 | 显示全部楼层
加了这个也没用
回复 支持 反对

使用道具 举报

发表于 2009-9-18 16:24:05 | 显示全部楼层
没说是这个原因导致的。只是说你这段代码中对数据集做循环时加上这样的代码。

关键是这段代码的效率很低。
你的两层循环中涉及到的数据量是多大?另外,我看你sQuery更新的数据跟DataSetBrokerASSESS_EMPLOYEE_SCORE这个数据集的数据是不是同一个表?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-18 16:28:43 | 显示全部楼层
是同一个表
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-18 16:31:55 | 显示全部楼层
我之所以这样做的目的是: 当A数据集中的数据和B数据集不同时,B中有A中没有 我在A对应的数据库表中添加相应的一条记录 B中没有A中有的时候 我在A对应的数据库表中把相应的状态改为0  然后 在打开数据集 并显示在DataGrid中  如果不用这种方法 我实在想不出用别的办法来实现
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-18 16:32:59 | 显示全部楼层
DataSetBrokerASSESS_EMPLOYEE_SCORE.DataSet.First;
                                   DataSetBrokerASSESS_EMPLOYEE_SCORE.DataSet.DisableControls;
                                   for i:=0 to DataSetBrokerASSESS_EMPLOYEE_SCORE.DataSet.RecordCount-1 do
                                   begin
                                        DataSetBrokerJOB_ASSESS_PROJECT.DataSet.First;
                                        DataSetBrokerJOB_ASSESS_PROJECT.DataSet.DisableControls;
                                        for j:=0 to DataSetBrokerJOB_ASSESS_PROJECT.DataSet.RecordCount-1 do
                                        begin
                                             if DataSetBrokerASSESS_EMPLOYEE_SCORE.DataSet.FieldByName('PROJ_NO').AsString = DataSetBrokerJOB_ASSESS_PROJECT.DataSet.FieldByName('PROJ_NO').AsString then
                                             begin
                                                  break;
                                             end;
                                             if j=DataSetBrokerJOB_ASSESS_PROJECT.DataSet.RecordCount-1 then
                                             begin
                                                  sQuery.Close;
                                                  sQuery.CommandText:='UPDATE ASSESS_EMPLOYEE_SCORE AES SET AES.STATUS=0 WHERE AES.USERID='+DataSetBrokerASSESS_EMPLOYEE_SCORE.DataSet.FieldByName('USERID').AsString+' AND AES.BONUS_IN='+DataSetBrokerASSESS_EMPLOYEE_SCORE.DataSet.FieldByName('BONUS_IN').AsString+' AND AES.PROJ_NO='+DataSetBrokerASSESS_EMPLOYEE_SCORE.DataSet.FieldByName('PROJ_NO').AsString;
                                                  sQuery.Execute;
                                             end;
                                             DataSetBrokerJOB_ASSESS_PROJECT.DataSet.Next;
                                        end;
                                        DataSetBrokerJOB_ASSESS_PROJECT.DataSet.EnableControls;
                                        DataSetBrokerASSESS_EMPLOYEE_SCORE.DataSet.Next;
                                   end;
                                   DataSetBrokerASSESS_EMPLOYEE_SCORE.DataSet.EnableControls;
                                   DataSetBrokerJOB_ASSESS_PROJECT.DataSet.First;
                                   DataSetBrokerJOB_ASSESS_PROJECT.DataSet.DisableControls;
                                   for i:=0 to DataSetBrokerJOB_ASSESS_PROJECT.DataSet.RecordCount-1 do
                                   begin
                                         DataSetBrokerASSESS_EMPLOYEE_SCORE.DataSet.First;
                                         DataSetBrokerASSESS_EMPLOYEE_SCORE.DataSet.DisableControls;
                                         for j:=0 to DataSetBrokerASSESS_EMPLOYEE_SCORE.DataSet.RecordCount-1 do
                                         begin
                                              if DataSetBrokerJOB_ASSESS_PROJECT.DataSet.FieldByName('PROJ_NO').AsString = DataSetBrokerASSESS_EMPLOYEE_SCORE.DataSet.FieldByName('PROJ_NO').AsString then
                                              begin
                                                   break;
                                              end;
                                              if j=DataSetBrokerASSESS_EMPLOYEE_SCORE.DataSet.RecordCount-1 then
                                              begin
                                                   sQuery.Close;
                                                   sQuery.CommandText:='INSERT INTO ASSESS_EMPLOYEE_SCORE'+
                                                                       '(PRIMARY_ID, USERID, USERNAME, JOB_NO, DEPT_NO, LEADER_ID,PROJ_NO,PROJ_NAME,PROJ_REMARKS,FULL_MARKS,BONUS_IN,FILLER_CODE,FILLER_NAME,FILLER_JOB_NO,STATUS,FILLER_DATE,PART_SCORE )'+
                                                                       ' VALUES (SEQ_EMPLOYEE_ASSESS.NEXTVAL,'+DataSetBrokerASSESS_PROJECT_CONDITION.DataSet.FieldByName('ASSESSED_MAN').AsString+','''+DataSetBrokerASSESS_PROJECT_CONDITION.DataSet.FieldByName('ASSESSED_MAN').DisplayText+''','+
                                                                       DataSetBrokerASSESS_PROJECT_CONDITION.DataSet.FieldByName('ASSESSED_MAN_JOB_NO').AsString+','+DataSetBrokerJOB_ASSESS_PROJECT.DataSet.FieldByName('DEPT_NO').AsString+','+
                                                                       DataSetBrokerASSESS_PROJECT_CONDITION.DataSet.FieldByName('ASSESS_OFFICER').AsString+','+DataSetBrokerJOB_ASSESS_PROJECT.DataSet.FieldByName('PROJ_NO').AsString+','''+
                                                                       DataSetBrokerJOB_ASSESS_PROJECT.DataSet.FieldByName('PROJ_NO').DisplayText+''','''+DataSetBrokerJOB_ASSESS_PROJECT.DataSet.FieldByName('PROJ_REMARKS').AsString+''','+
                                                                       DataSetBrokerJOB_ASSESS_PROJECT.DataSet.FieldByName('FULL_MARKS').AsString+','+DataSetBrokerASSESS_PROJECT_CONDITION.DataSet.FieldByName('BONUS_IN').AsString+','+
                                                                       DataSetBrokerASSESS_PROJECT_CONDITION.DataSet.FieldByName('ASSESS_OFFICER').AsString+','''+DataSetBrokerASSESS_PROJECT_CONDITION.DataSet.FieldByName('ASSESS_OFFICER').DisplayText+''','+
                                                                       DataSetBrokerASSESS_PROJECT_CONDITION.DataSet.FieldByName('ASSESS_OFFICER_JOB_NO').AsString+',1,TO_DATE('''+Sysutils.DateToStr(Business.Data.SysSrv.SysService.Time)+''',''YYYY-MM-DD''),NVL((SELECT MAX(AES.PART_SCORE) FROM ASSESS_EMPLOYEE_SCORE AES WHERE AES.USERID='+
                                                                       DataSetBrokerASSESS_PROJECT_CONDITION.DataSet.FieldByName('ASSESSED_MAN').AsString+' AND AES.BONUS_IN='+
                                                                       DataSetBrokerASSESS_PROJECT_CONDITION.DataSet.FieldByName('BONUS_IN').AsString+'-1 AND AES.PROJ_NO='+
                                                                       DataSetBrokerJOB_ASSESS_PROJECT.DataSet.FieldByName('PROJ_NO').AsString+'),0))';

                                                   sQuery.Execute;
                                              end;
                                              DataSetBrokerASSESS_EMPLOYEE_SCORE.DataSet.Next;
                                         end;
                                         DataSetBrokerASSESS_EMPLOYEE_SCORE.DataSet.EnableControls;
                                         DataSetBrokerJOB_ASSESS_PROJECT.DataSet.Next;
                                   end;
                                   DataSetBrokerJOB_ASSESS_PROJECT.DataSet.EnableControls;
                                   DataSetBrokerASSESS_EMPLOYEE_SCORE.DataSet.Active := False;
                                   DataSetBrokerASSESS_EMPLOYEE_SCORE.DataSet.Active := True;
                                   DataSetBrokerASSESS_EMPLOYEE_SCORE.DataSet.Refresh;
回复 支持 反对

使用道具 举报

发表于 2009-9-18 16:38:01 | 显示全部楼层
A/B数据集都涉及到同一个表还是两个表?
我个人建议你用存储过程来实现,也就是通过sql的方式来实现比这里循环数据集会优化很多的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-18 17:01:12 | 显示全部楼层
俩个表
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-15 20:03 , Processed in 0.046393 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表