更新数据时的慢循环性能

时间:2012-06-08 18:13:59

标签: vb.net winforms recursion for-loop while-loop

在我的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

2 个答案:

答案 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