热门(抱歉)答案,适用于那些没有时间进入但可能有类似问题的人。
规则#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,这也很慢 ;-)
表中有大约 3,600 行,这需要 45 秒来填充字符串网格。我究竟做错了什么?
ADODataSet := TADODataSet.Create(Nil); ADODataSet.Connection := AdoConnection; ADODataSet.CommandText := 'SELECT * FROM 测量值'; ADODataSet.CommandType := cmdText; ADODataSet.Open(); 而不是 ADODataSet.eof 做 开始 TestRunDataStringGrid.RowCount := TestRunDataStringGrid.RowCount + 1; measureDateTime := UnixToDateTime(ADODataSet.FieldByname('time_stamp').AsInteger); DoSQlCommandWithResultSet('SELECT * FROM start_time_stamp', AdoConnection, resultSet); startDateTime := UnixToDateTime(StrToInt64(resultSet.Strings[0])); elapsedTime := 测量日期时间 - 开始日期时间; 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; 结尾; ADODataSet.Close(); ADODataSet.Free();
更新:
函数 DoSQlCommandWithResultSet(const command : String; AdoConnection : TADOConnection; resultSet : TStringList): Boolean; 变量 我:整数; AdoQuery:TADOQuery; 开始 结果:=真; 结果集.清除(); AdoQuery := TADOQuery.Create(nil); 尝试 AdoQuery.Connection := AdoConnection; AdoQuery.SQL.Add(命令); AdoQuery.Open(); 我:= 0; 而不是 AdoQuery.eof 做 开始 resultSet.Add(ADOQuery.Fields[i].Value); 我 := 我 + 1; AdoQuery.Next; 结尾; 最后 AdoQuery.Close(); AdoQuery.Free(); 结尾; 结尾;