热门(抱歉)答案,适用于那些没有时间进入但可能有类似问题的人。
规则#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();
结尾;
结尾;