在我的winform应用程序中,我有2个数据表,都包含37000行。表1有171列,表2有4列。 While循环运行以更新表2中表4中的4列值。 For循环在内部运行而两次更新值。这样做需要5分钟以上。我认为应该是5秒的任务。
正在更新的列是:
Int64 - 1列
字符串 - 1列
布尔值 - 1列
日期 - 1列
有人可以说明可能导致此问题的原因吗?
While lintRowCounter < ldtCurrentData.Rows.Count
ldrCurrentDataRow = ldtCurrentData(lintRowCounter)
For Each lobjDataEntity As DataEntities In lstDataEntities
ldrCurrentDataRow(lobjDataEntity.SourceName) = ldtPositionData(lintRowCounter).Item(lobjDataEntity.SourceName)
If ldtCurrentData.Columns.Contains(lobjDataEntity.SourceName + mstrFormulaColSuffix) Then
ldrCurrentDataRow(lobjDataEntity.SourceName + mstrFormulaColSuffix) = ldtPositionData(lintRowCounter).Item(lobjDataEntity.SourceName + mstrFormulaColSuffix)
End If
If ldtCurrentData.Columns.Contains(mstrSOFColPrefix + lobjDataEntity.SourceName) Then
ldrCurrentDataRow(mstrSOFColPrefix + lobjDataEntity.SourceName) = ldtPositionData(lintRowCounter).Item(mstrSOFColPrefix + lobjDataEntity.SourceName)
End If
If ldtCurrentData.Columns.Contains(lobjDataEntity.SourceName + mstrSourceDateColSuffix) Then
ldrCurrentDataRow(lobjDataEntity.SourceName + mstrSourceDateColSuffix) = ldtPositionData(lintRowCounter).Item(lobjDataEntity.SourceName + mstrSourceDateColSuffix)
End If
Next
lintRowCounter += 1
End While
答案 0 :(得分:3)
好像你已经知道列名,为什么不直接引用它们而不是IF-CONTAINS呢?检查列名称的方式似乎很昂贵。此外,您应该考虑将此mstrSOFColPrefix + lobjDataEntity.SourceName
之类的代码放入单个变量中,以便反复构建该字符串。字符串会话很贵;希望这有帮助!
答案 1 :(得分:0)
我唯一能想到的就是批量更新。 (即,同时不是37,000,一次处理2,000个,因此程序不会超载。)
试试这个: http://msdn.microsoft.com/en-us/library/kbbwt18a%28v=vs.80%29.aspx#Y0
或者这个: http://msdn.microsoft.com/en-us/library/aadf8fk2%28v=vs.80%29.aspx