【问题标题】:SQL db lookup on each row in Excel在 Excel 中的每一行上查找 SQL db
【发布时间】:2013-10-01 20:38:25
【问题描述】:

我创建了一个网页,员工可以在其中上传 Excel xlsx 文档进行处理,如果满足要求,则返回相同的文档并填写某些关键单元格。它可以工作,但我对它的运行速度不满意。处理 2,500 行需要几分钟时间。

运行如下: 用户上传文件 -> 服务器端打开excel文档并逐行-> 如果当前行的第 31 列 != 10 则连接到 SQL 并根据第 5 列执行查询。-> 查询结果进入该行列 35。-> 下一行。冲洗并重复。 -> 完成后,将文件返回给用户。

虽然这可行,但它也相当慢。有没有人对解决此问题的更好方法有任何想法?

 For n = 2 To excelWorkSheet.Rows.Count

            Dim thing As String = excelWorkSheet.Cells(n, 5).Value
            'only until empty row 
            If excelWorkSheet.Cells(n, 5).Value = "" Then
                Exit For
            End If


            If excelWorkSheet.Cells(n, 31).Value <> "10" Then
                strSQL = "EXEC sp_Lookup_Type " & thing
                cmd.CommandText = strSQL
                cmd.Connection = cn
                rdrSQL = cmd.ExecuteReader()


                While rdrSQL.Read()
                    If Not IsDBNull(rdrSQL("TYPE")) Then
                        excelWorkSheet.Cells(n, 35).Value = rdrSQL("TYPE")
                    Else
                        excelWorkSheet.Cells(n, 35).Value = "NO DATA"
                    End If
                End While

                cmd.Dispose()
                rdrSQL.Close()
            End If
        Next

        cn.Close()

【问题讨论】:

  • 您是打开工作簿然后修改它还是在后台进行?
  • 我将文件作为 microsoft.office.interop.excel.worksheet 打开,然后遍历每一行。每行在我迭代时都会被修改,然后在最后保存。这一切都发生在服务器上 - 客户端只是显示一个“正在处理”页面。
  • David 有最好的方法,但提高速度的一种简单方法是在代码开头关闭 screenupdating=false。

标签: asp.net sql vb.net excel


【解决方案1】:

我的目标是减少 SQL 调用的数量。

选项#1:如果查找表中的项目数量足够少...

  • 在循环开始时一次性下载所有查找表
  • 在循环中,检查数据库表的本地副本,而不是每次都去数据库。

选项#2:如果您不能预先缓存所有项目...

  • 遍历您的电子表格一次并收集要查找的项目列表。
  • 对数据库进行一次调用,一次发送所有项目。
  • 数据库返回一小部分需要的值。
  • 使用小列表作为数据库缓存并按照“选项#1”中的步骤进行操作

【讨论】:

  • 我最终使用了选项 2,它缩短了几分钟的处理时间。我最终使用了 System.Data.Datatable 并使用我以后需要的行号和查找键预先填充了它。然后我将数据表传递给 SQL 存储过程。然后根据行号解析结果并放回excel表中。
猜你喜欢
  • 1970-01-01
  • 2019-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
相关资源
最近更新 更多