使用ADOQuery内存增加的问题(200分)

C

cheumen

Unregistered / Unconfirmed
GUEST, unregistred user!
使用ADOQuery时发现内存增加,而且将ADOQuery释放后内存不减少(请打开任务管理器,观察内存使用和虚拟内存大小两项,button点击前和点击后的内存变化)
button点击事件代码如下:
L_Query:=Tadoquery.Create(nil);
L_Query.Connection:=ADOConnection1;
//Form上的一个控件
L_Query.SQL.Text:='Select * from equipments'; //该数据为2万行左右
L_Query.ExecSQL;
//L_Query.Close;
FreeAndNil(L_Query);
我在使用过程中,有大量的数据量大的数据表,所以内存一直在增加而不能释放,问题很严重,导致内存不足。求原因和解决办法。谢谢!
 
L_Query.CussorLocation :=clUseServer
使用服务器端游标,这样ADO就不缓存记录
 
谢谢xiaoyin!
但是我分别尝试过下面的三条语句,结果还是一样的。
内存一点都不少
// L_Query.CursorLocation:=clUseServer;
// L_Query.CursorLocation:=clUseClient;
//L_Query.MaxRecords:=1000;
 
郁闷,一直解决不了这个问题~!
 
L_Query.free;
这个不知道可不可以!
 
谢谢delphi_zys,
使用L_Query.free;效果还是一样!郁闷啊~救救我吧
 
try
L_Query:=Tadoquery.Create(nil);
L_Query.Connection:=ADOConnection1;
//Form上的一个控件
L_Query.SQL.Text:='Select * from equipments'; //该数据为2万行左右
L_Query.ExecSQL;
finally
L_Query.free;
L_Query:=nil;
end;
 
使用ADOQuery时发现内存增加,而且将ADOQuery释放后内存不减少(请打开任务管理器,观察内存使用和虚拟内存大小两项,button点击前和点击后的内存变化)
button点击事件代码如下:
L_Query:=Tadoquery.Create(nil);
try
L_Query.Connection:=ADOConnection1;
L_Query.SQL.Text:='Select * from equipments'; //该数据为2万行左右
L_Query.ExecSQL;
///应该这样L_Query.Open;
//L_Query.Close;

finally
//用完最好close
FreeAndNil(L_Query);
end;
 
谢谢DIGUA,andrew57。
To DIGUA:FreeAndNil和分别使用Free和Nil的作用是一样的。当然,我也抱着希望试了一下,结果还是一样没有变化。
To andrew57:Open方法是返回结果集,ExecSQL是不返回结果集合。尝试了一下,内存占用更多了。
另:try finally语句对内存不存在直接的影响。尝试后结果一样。
 
楼主,我试了,创建自身是可以的
这样
procedure TForm1.Button1Click(Sender: TObject);
var
L_Query:TADOQuery;
begin
try
L_Query:=Tadoquery.Create(self);
******这里参数用self,别用nil
L_Query.Connection:=ADOConnection1;
//Form上的一个控件
L_Query.SQL.Text:='Select * from tmp';//该数据为2万行左右
L_Query.ExecSQL;
finally
L_Query.Close;
L_Query.free;
L_Query:=nil;
end;

end;
 
请楼主无论行否都给个话,关注
 
谢谢DIGUA。
我尝试了你的方法,情况没有改变。我现在提供另外一部分的辅助代码,帮助理解。
1.第一部分函数的目的是得到进程的物理内存使用+虚拟内存
2.第二部分按钮点击事件是直接释放物理内存的代码(但是必须为2003或xp系统!)
3.在程序最小化的时候内存是变小了的!!!
4.我想知道的是,怎样才能不使用第二部分的代码或最小化的情况下,将我不再使用的内存释放出来!为什么现在的正常释放掉控件但是内存不释放呢?这到底是一种怎么样的机制或是内存策略呢?实在是不解!
请先引用三个单元:psapi,shellapi,TLHelp32
第一部分函数:
//得到当前的物理内存、虚拟内存的方法
function TForm1.GetCurrMemory:integer;
var
lppe: TProcessEntry32;
//用于获取每个进程信息结构
found : boolean;
Hand : THandle;
pmc:pPROCESS_MEMORY_COUNTERS;//uses psApi
prohandle: HWND;
cb: DWORD;
begin
lppe.dwSize:=SizeOf(lppe);
cb := SizeOf(_PROCESS_MEMORY_COUNTERS);
GetMem(pmc, cb);
pmc^.cb := cb;
prohandle :=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False,GetCurrentProcessId);//由PID取得进程对象的句柄
if GetProcessMemoryInfo(prohandle, pmc, cb) then
begin
Result:=pmc^.PagefileUsage+pmc^.WorkingSetSize;
end;
FreeMem(pmc);
end;

第二部分,按钮点击事件
procedure TForm1.Button4Click(Sender: TObject);
begin
//WinXp,Win2003使用释放物理内存
if Win32Platform = VER_PLATFORM_WIN32_NT then
begin
SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF);
application.ProcessMessages;
end;
end;
 
晕了,都没仔细看,楼着你select * from
应该用L_Query.open;
不是L_Query.ExecSQL;
 
Open方法是返回结果集,ExecSQL是不返回结果集合。尝试了一下Open,内存占用更多了。
 
多人接受答案了。
 
顶部