目录
[1 前言](#1 前言)
[2 优化数据容器](#2 优化数据容器)
[3 开启事务插入数据](#3 开启事务插入数据)
[4 其他方面优化](#4 其他方面优化)
1 前言
近期有一个需求是向数据库中插入excel文件中的10万多条数据,接近70个字段。最初整个插入数据时间是大约40分钟,经过优化调整后,大幅优化为大约5分钟。这里简单介绍一下采取的措施。
2 优化数据容器
这里的数据容器是指,数据从外部读入后,插入数据库之前,暂时存放在什么地方。原来是以com方式调用excel程序,打开excel文件,读取数据到stringGrid中。这种方式速度慢,容易出错。现在改用fpsDataset读取excel数据,数据直接保存在数据集中。后面执行数据显示和插入数据到数据库中,直接操作这个数据集就可以了,非常快速高效。
前面介绍过这个fpSpreadSheet这个神器,操作电子表格太方便了。
Delphi
wsDataset := TsWorksheetDataset.create(self);
wsDataset.FileName := UTF8ToSys(fn); // fn是excel文件名
wsDataset.Open;
3 开启事务插入数据
开启事务方式后,插入数据效率有数十倍的提升!lazarus操作sqlite数据库,使用事务的语法如下:
Delphi
DM.SQLTransaction1.EndTransaction;
DM.SQLTransaction1.StartTransaction;
循环开始
。。。。。。
sql := 。。。。。。
try
DM.SQLite3Conn.ExecuteDirect(sql);
except
on E: Exception do
begin
showmessage('出错了7: ' + E.ClassName + '/' + E.Message);
memo1.append(ansiToUtf8(sql));
memo1.append('插入记录失败,sql语句:');
dm.SQLTransaction1.RollBack;
exit;
end;
end;
。。。。。。
循环结束
DM.SQLTransaction1.Commit;
4 其他方面优化
如果数据量特别大,就不需要在程序界面全部显示所有数据,那样太浪费时间,可以只显示100行或者1000行数据。