大家看看下面的程序,循环有10000--30000之间,数据库是Access,但关闭应用程序后,内存又回来了,说明不是内存泄露,每次循环内存大概会上升500K左右,请高手指教;
var
memoryStream :TMemoryStream;
tmpdataset: TADODataSet;
tf: TBlobField;
begin
memoryStream := TMemoryStream.Create();
for i:= 1 to 10000 do
begin
memoryStream.LoadFromFile(ExtractFilePath(Application.ExeName) +'\test.bmp');
tmpdataset.Append();
tf := tmpdataset.FieldByName('BITMAP') as TBlobField;
tf.LoadFromStream(memoryStream);
tmpdataset.Post();
Application.ProcessMessages; end;
memoryStream.Free;end
var
memoryStream :TMemoryStream;
tmpdataset: TADODataSet;
tf: TBlobField;
begin
memoryStream := TMemoryStream.Create();
for i:= 1 to 10000 do
begin
memoryStream.LoadFromFile(ExtractFilePath(Application.ExeName) +'\test.bmp');
tmpdataset.Append();
tf := tmpdataset.FieldByName('BITMAP') as TBlobField;
tf.LoadFromStream(memoryStream);
tmpdataset.Post();
Application.ProcessMessages; end;
memoryStream.Free;end
begin
memoryStream := TMemoryStream.Create();
memoryStream.LoadFromFile(ExtractFilePath(Application.ExeName) +'\test.bmp');
tmpdataset.Append();
tf := tmpdataset.FieldByName('BITMAP') as TBlobField;
tf.LoadFromStream(memoryStream);
tmpdataset.Post();
Application.ProcessMessages;
memoryStream.Free;
end;
写到循环外,最后才释放内存,肯定不合适了
freein(memoryStream),不过具体函数名我不记得了,跟freein这个有点象,你查查看,这个对你有没有用
for i:= 1 to 10000 do
begin
adodataset.close;
adodataset.commandtext :='select BITMAP,num where num=-1';//num是流水号,返回0个记录
adodataset.open;
.....
lijinghe1 的说法有点道理
你执行完以后 close结果集内存会降下来吗?如果没有完全降下是 ado驱动也有一部份在缓存区中
drift1981 第一次 的做法还是效率低下有必要每次close open?
用query 不就的了
inser into (:p)
param('p').loadfromstream
我找到了一个解决的方法,和大家分享一下var
strSQL : String;
tmpdataset: TADODataSet;
begin
strSQL := 'insert into test(picture) values(:picture)';
tmpdataset.close();
for i:= 1 to 10000 do
begin
tmpdatasetparemater.ParamByName('picture').LoadFromFile(e:\test.bmp',ftBlob);
tmpdataset.ExecSQL();
Application.ProcessMessages;
end;
end