我在程序中需要对两个数据库中的内容进行比对,故而需要频繁使用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;
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;
解决方案 »
- dll中 无法sendmessage 给主程序
- 程序自动退出是怎么回事
- intraweb中iwtreeview如何实现拖曳的功能?
- [醒目]困惑好久...Console Application如何在运行的时候隐藏
- 100分!在子窗口中更新数据,用FMainFrm.ADOQry.UpdateBatch(arAll)为什么会出错?
- query+access 总是提示时间格式无效,我应该怎么修改下面的两行代码?再线等待
- ParamStr(1)的问题
- 我用Sybase做数据库,但我不知道用什么方法实现数据库一对多连接,请高手回答。
- 一个SQL的问题:在线恭候
- 一个常见的问题,关于查询后插入数据入库。。。。
- 实时数据库技术中的一个压缩算法的误差计算
- 使用IdTcpClient和IdTcpServer组件传送图片时出错: Socket Error # 10061 Connection refused
如果是内存一直往上长,你可以尝试
tquery 和 TStringList 用完之后 马上释放掉。
跟跟看 看在哪些步 内存会up上去。
一个大的try finally end。以前好象也碰到过类似的问题。