公司同仁写的,好久不玩DELPHI了,觉得有问题,但又说不出。
不是说程序不能执行,但是内存、效率、维护方面,总感觉有些问题,请大家帮忙看看
// update MNIDOnline
// flag
//首先判断当前mnid是否存在
//如果存在则update
//如果不存在则Add
function TDMSimulation.UpdateCurrentMNIDOnline(var mnid : TMNID; flag : integer) : boolean;
var  qryTemp : TQuery;
begin
    //
  try
    OpenDataBase;
    qryTemp := TQuery.Create(Self); 
    qryTemp.DatabaseName := Self.SQCDB.DatabaseName;
    qryTemp.SQL.Clear;
    qryTemp.SQL.Text  := Format('SELECT MNID from TBLMNID WHERE UPPER(MNID)=''%S'''
                                , [UpperCase(mnid.MNID)]);
    qryTemp.Open;
    if  not qryTemp.IsEmpty  then //update
    begin
      qryTemp.SQL.Clear ;
      qryTemp.SQL.Text := Format('update tblmnid set mocode = ''%S'',RouteID=''%S'''
                                 +',CurrRoute= ''%S'',CurrSegment = ''%S'',CurrStepSeq = ''%S'''
                                 +',CurrOP= ''%S'',CurrRes=''%S'',NextRoute=''%S'''
                                 +',NextOP=''%S'' where MNID=''%S'''
                                 ,[mnid.MOCode,mnid.RouteID,mnid.CurrentRouteID
                                 ,mnid.CurrentSegmentID,mnid.CurrentStepSequenceID
                                 ,mnid.CurrentOpeartionID,mnid.CurrentResourceID
                                 ,mnid.NextRouteID,mnid.NextOpeartionID,mnid.MNID]);
      qryTemp.ExecSQL;
      qryTemp.Close;
    end
    else
    begin
      qryTemp.SQL.Clear;
      qryTemp.SQL.Text := Format('insert into tblmnid values(''%S'',''%S'',''%S'''
                                 +',''%S'',''%S'',''%S'''
                                 +',''%S'',''%S'',''%S'''
                                 +',''%S'' )'
                                 ,[mnid.MNID,mnid.MOCode,mnid.RouteID,mnid.CurrentRouteID
                                 ,mnid.CurrentSegmentID,mnid.CurrentStepSequenceID
                                 ,mnid.CurrentOpeartionID,mnid.CurrentResourceID
                                 ,mnid.NextRouteID,mnid.NextOpeartionID]);
      qryTemp.ExecSQL;
      qryTemp.Close;
    end;
  except  on E:Exception do
        begin
          raise Exception.Create('44002' );
        end;  end;    end;

解决方案 »

  1.   

    不用看做什么用的拉吧
    直接批吧,我是懒的去一个个挑了qryTemp := TQuery.Create(Self); 
    没有保证出现异常时,释放qryTemp 
    SELECT MNID from TBLMNID WHERE UPPER(MNID)=''%S'''时,如果没有查到记录,那么qryTemp 没有Close......
    大家帮忙看看吧,我懒的批这种代码了
    这种代码要跑到生产线上去,恐怕要死人呀!
      

  2.   

    Delphi版都没人抢分呀,是大家水平都太高了,还是人气太差了,还是分不值钱了???怪
      

  3.   

    //qryTemp := TQuery.Create(Self); 就这句,大家说说,这种代码跑时间长了,有什么后果?
    什么时候这个内存才会被释放??
    就当玩玩代码吧
      

  4.   

    function TDMSimulation.UpdateCurrentMNIDOnline(var mnid : TMNID; flag : integer) : boolean;
    var  qryTemp : TQuery;
    begin
        //
      try
        OpenDataBase;
        qryTemp := TQuery.Create(Self); 
        qryTemp.DatabaseName := Self.SQCDB.DatabaseName;
        qryTemp.SQL.Clear;
        qryTemp.SQL.Text  := Format('SELECT MNID from TBLMNID WHERE UPPER(MNID)=''%S'''
                                    , [UpperCase(mnid.MNID)]);
        qryTemp.Open;
        if  not qryTemp.IsEmpty  then //update
        begin
          qryTemp.SQL.Clear ;
          qryTemp.SQL.Text := Format('update tblmnid set mocode = ''%S'',RouteID=''%S'''
                                     +',CurrRoute= ''%S'',CurrSegment = ''%S'',CurrStepSeq = ''%S'''
                                     +',CurrOP= ''%S'',CurrRes=''%S'',NextRoute=''%S'''
                                     +',NextOP=''%S'' where MNID=''%S'''
                                     ,[mnid.MOCode,mnid.RouteID,mnid.CurrentRouteID
                                     ,mnid.CurrentSegmentID,mnid.CurrentStepSequenceID
                                     ,mnid.CurrentOpeartionID,mnid.CurrentResourceID
                                     ,mnid.NextRouteID,mnid.NextOpeartionID,mnid.MNID]);
          qryTemp.ExecSQL;
          qryTemp.Close;
        end
        else
        begin
          qryTemp.SQL.Clear;
          qryTemp.SQL.Text := Format('insert into tblmnid values(''%S'',''%S'',''%S'''
                                     +',''%S'',''%S'',''%S'''
                                     +',''%S'',''%S'',''%S'''
                                     +',''%S'' )'
                                     ,[mnid.MNID,mnid.MOCode,mnid.RouteID,mnid.CurrentRouteID
                                     ,mnid.CurrentSegmentID,mnid.CurrentStepSequenceID
                                     ,mnid.CurrentOpeartionID,mnid.CurrentResourceID
                                     ,mnid.NextRouteID,mnid.NextOpeartionID]);
          qryTemp.ExecSQL;
          qryTemp.Close;
        end;
      except  on E:Exception do
            begin
              raise Exception.Create('44002' );
            end;  end;    
      qryTemp.free;//应该在这里释放,不然只有等到form free的时候
    end;
      

  5.   

    qryTemp := TQuery.Create(Self);
    当前过程或函数结束后自动就释放,delphi会自动释放,
    表面上看没有什么问题,不过既然是函数 为什么没有返回值啊?就是result:=true 或者;
        result:=false;
    应该有这样的语句才是完整的函数function 啊!
      

  6.   

    关闭query 我一般是在 窗体关闭的时候一起释放的
    不过一般使用clear 过程前得先close query的
    qryTemp.Open;    ***
        if  not qryTemp.IsEmpty  then //update
        begin
          qryTemp.close;     ////////////////////////
          qryTemp.SQL.Clear ;***
          qryTemp.SQL.Text := Format............
        ...........
       else
        begin
          qryTemp.close;    ///////////////////////
          qryTemp.SQL.Clear;***
          qryTemp.SQL.Text := Format('insert ...........
      

  7.   

    zjqyb(风清扬*任它溺水三千,我只取一瓢饮*) :
        qryTemp := TQuery.Create(Self);  
    create Self 的东西,你自己去释放合理吗?
      

  8.   

    没有返回值;qryTemp最好要在自己释放;另外qryTemp在返回记录集后没有关闭就用来执行UPDATE或INSERT操作好象不妥。cxx1997(小网虫)(最厉害的妖怪)) 
    什么时候又跑这溜达啦
      

  9.   

    gcj123(佛的光辉):
       苦闷呀,给这帮家伙提点意见,居然对我有意见了,我们有意见就在这里提,发点牢骚而已
      

  10.   

    怀念DELPHI时代呀
    DEIPHI多好呀,给这帮家伙这么折腾,到时一定要骂DELPHI,说DELPHI内存机制不好用
      

  11.   

    qryTemp := TQuery.Create(Self);  
    create Self 的东西,你自己去释放合理吗?当然合理,自己创建临时的对象,用完应该立即释放,不要占着毛坑布拉斯
    Create(self)和Create(nil) 无关紧要
      

  12.   

    zjqyb(风清扬*任它溺水三千,我只取一瓢饮*) :
        如果是Create(Self)
    我觉得不需要自己去释放,因为,当Self被释放的时候他会去释放,如果你已经释放了,那么就会出错。
    当然,有的Self释放前会去检查,但你这么写就依赖于某个Self了。最后从程序逻辑上说:临时的对象为什么要委托给Self去释放?所以,我觉得你如果手动释放一个Create(self)那么一定是有问题的。
      

  13.   

    zjqyb(风清扬*任它溺水三千,我只取一瓢饮*) :
        freeAndNil 也是错,因为逻辑上错了!
      

  14.   

    1:没有返回值;
    2:qryTemp最好要在自己释放;
    3:另外qryTemp在返回记录集后没有关闭就用来执行UPDATE或INSERT操作好象不妥
    4:update 时,条件没有不区分大小写
    5:没有保证存入的MNID和数据库现有的大小写状态一致
    6:接口中 var mnid : TMNID  的作用??
    7:不管什么错误都返回'44002'?
    8:flag : integer 的作用?
    9:没有检查mnid : TMNID的数据是否正常
      

  15.   

    临时的最好不要用Create(Self)
    如果一定要用
    var ss:TQuery;
      ss:=Tquery.Create(self);
      ....
      self.RemoveComponent(ss);
      FreeAndNil(ss);
    临时:
      ss:=Tquery.Create(nil);
      ....
      FreeAndNil(ss);
      

  16.   

    right
    如果临时的用ss.free就可以了
    FreeAndNil这个不太符合逻辑,如果是全局的,就很有必要