递归程序出现了内存耗尽,该如何解决呢? ( 积分: 20 )

  • 主题发起人 主题发起人 guzhengyi_nj
  • 开始时间 开始时间
G

guzhengyi_nj

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了个寻找路径的函数,当库里纪录比较多时就会出现死机的情况,是什么原因呢?
应该怎么解决?
有劳大家帮我看看!谢谢!

function TForm1.getpath(r1, r2, p1: string):boolean;
var
num,i:integer;
qu:TADOQuery;
p3,sql,temp,p2:string;
begin

qu:=TADOQuery.Create(application);
qu.Close ;
qu.sql.clear;
sql:='select * from AllIPConn where router1='''+r1+'''';
qu.SQL.Add(sql);
qu.Connection:=ADOConnection2;
qu.open;
num:=qu.RecordCount ;
if num>0 then
begin
for i := 0 to num-1 do
begin
p3:=p1;
temp:=qu.FieldByName('router2').AsString ;
if trim(temp)=r2 then
begin
result:=true;
exit;
end
else
begin
p3:=p3+'-'+temp;
qu.Next ;
getpath(temp,r2,p3);
end;
end;
end
else
result:=false;

end;
 
我写了个寻找路径的函数,当库里纪录比较多时就会出现死机的情况,是什么原因呢?
应该怎么解决?
有劳大家帮我看看!谢谢!

function TForm1.getpath(r1, r2, p1: string):boolean;
var
num,i:integer;
qu:TADOQuery;
p3,sql,temp,p2:string;
begin

qu:=TADOQuery.Create(application);
qu.Close ;
qu.sql.clear;
sql:='select * from AllIPConn where router1='''+r1+'''';
qu.SQL.Add(sql);
qu.Connection:=ADOConnection2;
qu.open;
num:=qu.RecordCount ;
if num>0 then
begin
for i := 0 to num-1 do
begin
p3:=p1;
temp:=qu.FieldByName('router2').AsString ;
if trim(temp)=r2 then
begin
result:=true;
exit;
end
else
begin
p3:=p3+'-'+temp;
qu.Next ;
getpath(temp,r2,p3);
end;
end;
end
else
result:=false;

end;
 
qu:=TADOQuery.Create(application);
qu.Close ;
qu.sql.clear;
sql:='select * from AllIPConn where router1='''+r1+'''';
qu.SQL.Add(sql);
qu.Connection:=ADOConnection2;
qu.open;


不要频繁创建,而且建立以后要Free

qu:=TADOQuery.Create(application);
qu.Close ;
qu.sql.clear;
sql:='select * from AllIPConn where router1='''+r1+'''';
qu.SQL.Add(sql);
qu.Connection:=ADOConnection2;
qu.open;
num:=qu.RecordCount ;
if num>0 then
begin
for i := 0 to num-1 do
begin
p3:=p1;
temp:=qu.FieldByName('router2').AsString ;
if trim(temp)=r2 then
begin
result:=true;
exit;
end
else
begin
p3:=p3+'-'+temp;
qu.Next ;
getpath(temp,r2,p3);
end;
end;
end
else
result:=false;
[blue]qu.Free;[/blue]
 
对,把qu:=TADOQuery.Create(application);语句放在Form Show或别的地方.
 
还是不行啊!
如何是好啊?
 
function TForm1.getpath(r1, r2, p1: string):boolean;
var
num,i:integer;
p3,sql,temp,p2:string;
begin
qu.Close ;
qu.sql.clear;
sql:='select router2 from AllIPConn where router1='''+r1+'''';
qu.SQL.Add(sql)

qu.open;
num:=qu.RecordCount ;
if num>0 then
begin
for i := 0 to num-1 do
begin
p3:=p1;
temp:=qu.FieldByName('router2').AsString ;
if trim(temp)=r2 then
begin
result:=true;
exit;
end
else
begin
p3:=p3+'-'+temp;
qu.Next ;
getpath(temp,r2,p3);
end;
end;
end
else
result:=false;

end;
帮你做了一些改动,把query拿到外面去。最好放到服务器上写存储过程,我不会
 
在FormShow或FormCreate里写:
qu:=TADOQuery.Create(application);
qu.Connection:=ADOConnection2;
或直接在Form中拖一个ADOQuery,Connection 属性设为ADOConnection2就可以了,不要在递归函数中创建,如果实在想在递归函数中创建的话要在函数的末尾释放,在函数的最后调用qu.free。
 
或者用存储过程也行,如下:
CREATE proc P_QueryIP @ip1 varchar(30),@ip2 varchar(30),@AllRouteTemp varchar(200),@AllRoute varchar(200) output,@Finded char(1) output
AS
Begin
set nocount on
declare @ipTemp varchar(30)

select @AllRoute=@AllRouteTemp
select @Finded='Y'

if (not exists(select route2 from AllIPConn where Route1=@ip1))
begin
select @Finded='N'
return
end
select @ipTemp=route2 from AllIPConn where Route1=@ip1

while (@ipTemp<>@ip2)
begin
select @AllRoute=@AllRoute+'-'+@ipTemp
if (not exists(select route2 from AllIPConn where Route1=@ipTemp))
begin
select @Finded='N'
return
end
select @ipTemp=route2 from AllIPConn where Route1=@ipTemp
end

return

set nocount off
End
GO


然后在程序中调用即可。
 
to hurrybai
不好意思,我没用过存储过程,我已经新建了这个存储过程,但不知如何调用,请多多指教!
谢谢!
 
http://www.delphibbs.com/delphibbs/dispq.asp?LID=375512
标题: 如何在程序中调用sql7.0的存储过程?help me

http://www.delphibbs.com/delphibbs/dispq.asp?LID=328679
标题是: TADOquery 如何调用带有返回值的Sql Server存储过程?
 
后退
顶部