对于那些没有时间深入了解但可能遇到类似问题的人,以下是按照顶部回复(抱歉)的答案。
规则#1,始终将尽可能多的内容移出循环。
2. 将 TField var := ADODataSet.FieldByname() 移出循环。
3. 在循环周围使用 ADODataSet.DisableControls(); 和 ADODataSet.EnableControls();
4. 对每一行使用 stringGrid.Rows[r].BeginUpdate() 和 EndUpdate()(无法在整个控件上执行)
这些操作每次都可以节省几秒钟,但是通过更改,我将其缩短到“眨眼之间”。
loop
stringGrid.RowCount := stringGrid.RowCount + 1;
end loop
将stringGrid.RowCount := ADODataSet.RecordCount;
放在循环之前
对于所有帮助过我的人,我表示+1和衷心的感谢。
(现在我将去看看如何优化绘制TChart,因为它也很慢;-)
表格中有大约3600行数据,这需要45秒才能填充字符串网格。我做错了什么?
ADODataSet := TADODataSet.Create(Nil); ADODataSet.Connection := AdoConnection;
ADODataSet.CommandText := 'SELECT * FROM measurements'; ADODataSet.CommandType := cmdText; ADODataSet.Open();
while not ADODataSet.eof do begin TestRunDataStringGrid.RowCount := TestRunDataStringGrid.RowCount + 1;
measurementDateTime := UnixToDateTime(ADODataSet.FieldByname('time_stamp').AsInteger); DoSQlCommandWithResultSet('SELECT * FROM start_time_stamp', AdoConnection, resultSet); startDateTime := UnixToDateTime(StrToInt64(resultSet.Strings[0])); elapsedTime := measurementDateTime - startDateTime; TestRunDataStringGrid.Cells[0, Pred(TestRunDataStringGrid.RowCount)] := FormatDateTime('hh:mm:ss', elapsedTime); TestRunDataStringGrid.Cells[1, Pred(TestRunDataStringGrid.RowCount)] := FloatToStrWithPrecision(ADODataSet.FieldByname('inputTemperature').AsFloat); TestRunDataStringGrid.Cells[2, Pred(TestRunDataStringGrid.RowCount)] := FloatToStrWithPrecision(ADODataSet.FieldByname('outputTemperature').AsFloat); TestRunDataStringGrid.Cells[3, Pred(TestRunDataStringGrid.RowCount)] := FloatToStrWithPrecision(ADODataSet.FieldByname('flowRate').AsFloat); TestRunDataStringGrid.Cells[4, Pred(TestRunDataStringGrid.RowCount)] := FloatToStrWithPrecision(ADODataSet.FieldByname('waterPressure').AsFloat * convert); TestRunDataStringGrid.Cells[5, Pred(TestRunDataStringGrid.RowCount)] := FloatToStrWithPrecision(ADODataSet.FieldByname('waterLevel').AsFloat); TestRunDataStringGrid.Cells[6, Pred(TestRunDataStringGrid.RowCount)] := FloatToStrWithPrecision(ADODataSet.FieldByname('cod').AsFloat); ADODataSet.Next; end;
ADODataSet.Close(); ADODataSet.Free();
更新:
Function DoSQlCommandWithResultSet(const command : String; AdoConnection : TADOConnection; resultSet : TStringList): Boolean; var i : Integer; AdoQuery : TADOQuery;
begin Result := True; resultSet.Clear();
AdoQuery := TADOQuery.Create(nil); try AdoQuery.Connection := AdoConnection; AdoQuery.SQL.Add(command); AdoQuery.Open(); i := 0; while not AdoQuery.eof do begin resultSet.Add(ADOQuery.Fields[i].Value); i := i + 1; AdoQuery.Next; end;
finally AdoQuery.Close(); AdoQuery.Free(); end; end;
select * from time_stamp
应该返回多少行;也许有数十亿行? - 9000