0

在我的 winform 应用程序中,我有 2 个数据表,都包含 37000 行。表 1 有 171 列,表 2 有 4 列。运行 While 循环以更新表 2 中 4 列的表 1 中的值。For 循环在 While 内运行两次以更新值。这样做需要超过 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
4

2 回答 2

3

似乎您已经知道列名,为什么不直接引用它们而不是执行 IF-CONTAINS?以这种方式检查列名似乎很昂贵。此外,您应该考虑将这样的代码mstrSOFColPrefix + lobjDataEntity.SourceName放入单个变量中,以便一遍又一遍地构建该字符串。字符串连接很昂贵;希望这可以帮助!

于 2012-06-08T20:08:54.827 回答
0

我唯一能想到的就是批量更新。(即一次处理 2,000 个,而不是一次处理 37,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

于 2012-06-08T18:59:06.667 回答