For Each cc As String In Split(lst.Value, ",")
cmd.CommandText = "SEL ECT * F rom {图定列车} where 车次= '" & cc & "'"
dt = cmd.ExecuteReader()
' 遍历日期范围
For j As Integer = 0 To ts.Days - 1
Dim currentDate As Date = sd.Value.AddDays(j)
' 添加新记录
For Each dr1 As DataRow In dt.DataRows
Try
Dim dr2 As DataRow = DataTables("列车计划").AddNew()
For i As Integer = 0 To Cols1.Length - 1
dr2(Cols2(i)) = dr1(Cols1(i))
Next
dr2("日期") = currentDate
dr2("序号") = dr1("序号") ' 将图定列车的序号赋值给列车计划的序号
dr2("停开") = "开行"
dr2.Save()
Catch ex As Exception
MessageBox.Show("添加记录时发生错误: " & ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return
End Try
Next
' 更新进度条
p.Value += 1
Application.DoEvents() ' 刷新界面
Next
Next
这个耗时应该是正常的。假设是lst集合有5000个,
ts.Days不知道有几天,再乘于5000就不止5000条记录了
1、cmd会执行5000次,后台查询一向都费时间
2、dr2.Save()会保存【lst.count * ts.Days】次。考虑去掉这一句,到最后直接保存一次DataTables("列车计划").save即可
3、更新进度条的Application.DoEvents()操作会导致程序处理变慢,大概会慢10倍以上
cmd.CommandText = "SEL ECT * F rom {图定列车} where 车次= '" & cc & "'" 这里改成 IN。
这样查询1次,存在临时建立的datatable里面。后面再从这个临时的datatable里面查询。
两个FOR连用,是灾难,要避免。
application.do events 不用每次就进行,如果一定要刷新,可以在第一层for 里面刷新。
在for里面save,服务器吃不消。