delphi批量存入多媒体字段 遇到内存溢出的坑

最近delphi做一个小工具其中一个需求要把上W张照片存入数据库多媒体字段。

程序转到1,2W的时候即内在溢出了。最多一次转了3W张照片。很简单的一段代码后来仔细检查发现其中的坑。

下面放上代码

 1   with DMConn.AdsEdit do
 2   begin
 3     Active := False;
 4     CommandText := 'SELECT ID, Data, Ext FROM Table where 1=2';
 5     Active := True;
 6   end;
 7   
 8   with DMDst.UniQuery do
 9   begin
10     Active := False;
11     SQL.Clear();
12     SQL.Add(vSql);      
13     Active := True;  
14     while not Eof do
15     begin
16       vFile := vPath + DMDst.UniQuery.FieldByName('PATH').AsString;
17       vNewID := DMDst.UniQuery.FieldByName('NewID').AsString;
18       gg.Str.Replace(vFile, '/', '\');
19       vPersonID := ExtractFileNameNoExt(vFile);
20 
21       if FileExists(vFile) and (DMConn.GetSQLValueInt('SELECT count(*) FROM Table where ID = ' + QuotedStr(vNewID)) <= 0) then
22       begin
23         try
24           with DMConn.AdsEdit do
25           begin
26             Edit;
27             Append;
28             FieldByName('ID').AsString := vNewPersonID;
29             FieldByName('Ext').AsString := ExtractFileExt(vFile);
30             TBlobField(FieldByName('Data')).LoadFromFile(vFile);
31             Post;
32           end;
33         finally
34         end;
35       end;
36       Next;
37     end;

注意:

'SELECT ID, Data, Ext FROM Table where 1=2'; 这段代码中的where 1=2就是这个where加上这后进程内存一直保持在30M左右不加这个where内在就一直不停增长,直到内存溢出。感觉不加这一句,每次添加的照片就增加到

DMConn.AdsEdit里面了。
posted @ 2018-12-26 08:44  muyuer  阅读(373)  评论(0编辑  收藏  举报