我在程序中需要对两个数据库中的内容进行比对,故而需要频繁使用ADOQuery对象,但发现占用的内存不断增长,各位帮忙看看吧!
procedure TData.writeSendTable(const sTable, sDistrict: String);
var
  voZgQuery: TADOQuery;
  voCopyQuery: TADOQuery;
  voStrList: TStringList;
  vsSQL: String;
  voKeyFieldList: TStringList;
  vsZgPath: String;
  vsCond: String;
  vsFields: String;
  vsValues: String;begin
  voStrList:= TStringList.Create;
  voZgQuery:= TADOQuery.Create(self);
  voCopyQuery:= TADOQuery.Create(self);  try
    vsZgPath:= _io.getDBPath+ '\DAT';
    vsCond:= '1=1';
    if _io.getAppType= 'client' then begin
      vsCond:= _io.getTableNoCol(sTable) + ' like '''+ sDistrict+ '%''';
    end else if _io.getAppType= 'server' then begin
      vsCond:= _io.getTableNoCol(sTable) + ' like '''+ makeRealDistrict(sDistrict)+ '%'' and ' + _io.getTableNoCol(sTable) + ' not like '''+ sDistrict+ '%''';
    end; //<root><command><request type="update" district="360000" uid="2005-11-3 14:06:001"></request></command>
 //      <data><zg><record action="insert"><newvalue><n0>36000007600358</n0> ...</newvalue></record>
   try
      _io.writeTextFile(_io.getDBPath+'\certmanage\source\'+sTable+'.xml','<?xml version="1.0" encoding="gb2312"?><root><'+ sTable+ '>');//复盖原xml文件
      voKeyFieldList:= _io.getKeyFields(sTable);
      vsSQL:= 'select * from '+ sTable + ' where '+ vsCond;
     // voZgQuery:= _zgdbconn.execSQL(vsSQL);
      _zgdbconn.execSQLSearch(vsSQL,voZgQuery);
      if (voZgQuery.Recordset.EOF= false ) then
      begin
        voStrList.Clear;
        while(voZgQuery.Recordset.EOF= false) do
        begin          vsSQL:= 'select * from '+ sTable+ ' where '+ makeKeyFieldCond(voKeyFieldList, voZgQuery.Recordset, sTable);
 //         voCopyQuery:= _copydbconn.execSQL(vsSQL);
          voCopyQuery:= TADOQuery.Create(self);
          _copydbconn.execSQLSearch(vsSQL,voCopyQuery);
          if (voCopyQuery.Recordset.EOF) then
          begin
            voStrList.Append('<record action="'+ ACTION_INSERT+ '">');
            voStrList.Append('<newvalue>');
            voStrList.Append(makeChangedFields(voZgQuery.RecordSet));
            voStrList.Append('</newvalue>');
            voStrList.Append('</record>');
          end
          else  begin
            if compareRow(voZgQuery.RecordSet, voCopyQuery.RecordSet)= False then
            begin
              voStrList.Append('<record action="'+ ACTION_UPDATE+ '">');
              voStrList.Append('<oldvalue>');
              voStrList.Append(makeChangedFields(voCopyQuery.RecordSet));
              voStrList.Append('</oldvalue>');
              voStrList.Append('<newvalue>');
              voStrList.Append(makeChangedFields(voZgQuery.RecordSet));
              voStrList.Append('</newvalue>');
              voStrList.Append('</record>');
            end;//if compareRow(voSourQuery.RecordSet, voCopyQuery.RecordSet)= False
            voCopyQuery.First;
            voCopyQuery.Close;
            voCopyQuery.Free;
            voCopyQuery:=nil;          end;//if (voCopyQuery.Recordset.EOF)
          voZgQuery.Recordset.MoveNext;        end;// while(voZgQuery.Recordset.EOF= false) do
        _io.appendTextFile(_io.getDBPath+'\certmanage\source\'+sTable+'.xml',_util.strListToString(voStrList));
        voZgQuery.First;
        voZgQuery.Close;
        voZgQuery.Free;      end;//  if voZgQuery.Recordset.EOF= false
      vsSQL:= 'select * from '+ sTable + ' where ' + vsCond;
      voCopyQuery:= _copydbconn.execSQL(vsSQL);
      voCopyQuery:= TADOQuery.Create(self);
      _copydbconn.execSQLSearch(vsSQL,voCopyQuery);
      if (voCopyQuery.Recordset.EOF)   then    exit;
      voStrList.Clear;
      while(voCopyQuery.Recordset.EOF= false) do
      begin 
          vsSQL:= 'select * from '+ sTable+ ' where '+ makeKeyFieldCond(voKeyFieldList, voCopyQuery.Recordset, sTable);
 //         voZgQuery:= _zgdbconn.execSQL(vsSQL);
          voZgQuery:= TADOQuery.Create(self);
          _zgdbconn.execSQLSearch(vsSQL,voZgQuery);
          if voZgQuery.Recordset.EOF then begin
            voStrList.Append('<record action="'+ ACTION_DELETE+ '">');
            voStrList.Append('<oldvalue>');
            voStrList.Append(makeChangedFields(voCopyQuery.RecordSet));
            voStrList.Append('</oldvalue>');
            voStrList.Append('</record>');
          end
          else  begin
            voZgQuery.First;
            voZgQuery.Close;
            voZgQuery.Free;
            voZgQuery:=nil;         end; // if voZgQuery.Recordset.EOF
         voCopyQuery.Recordset.MoveNext;
      end; // while(voCopyQuery.Recordset.EOF= false)
      _io.appendTextFile(_io.getDBPath+'\certmanage\source\'+sTable+'.xml',_util.strListToString(voStrList));
      voCopyQuery.First;
      voCopyQuery.Close;
      voCopyQuery.Free;
      voCopyQuery:=nil;      except
        on e: Exception do
          _util.log('Client.writeSendTable():'+ #10+ e.Message);
      end;
  finally
    _io.appendTextFile(_io.getDBPath+'\certmanage\source\'+sTable+'.xml','</'+ sTable+ '></root>');
    voStrList.Free;
 //   voZgQuery.Free;
   // voCopyQuery.Free; 
    if voKeyFieldList<>nil then   voKeyFieldList.Free;
  end;
end;