【发布时间】:2019-11-01 23:25:26
【问题描述】:
我使用下面的循环遍历一列并对每个单元格值执行查询。鉴于此列中的单元格数量很容易超过 10'000 行,这不是一个非常快速的方法,因此我正在寻找另一种方法来提高性能。
我正在考虑用单元格的值填充一个数组,但是使用这种方法很可能仍然需要遍历所述数组并为每次迭代执行查询。
我不熟悉任何可能执行一次查询或至少显着提高此过程的性能的方法。有什么想法吗?
Public Function getdata(query As String) As ADODB.Recordset
Dim cnn As ADODB.Connection
Dim connstring As String
Set cnn = New ADODB.Connection
connstring = "Provider=SQLOLEDB;Data Source=noneofyourbusiness;Connect Timeout=180"
cnn.Open connstring
Set getdata = New ADODB.Recordset
getdata.CursorLocation = adUseClient
getdata.Open query, connstring, 2, adLockReadOnly
End Function
Sub start()
'code...
For Each c In sht.Range("J3:J" & LRow)
If Not c.Value = "" Then
'Query
Set rs = getdata("SELECT 'Checked' FROM astAssetTypes AT JOIN astAssetTypesUDFV UDFV ON UDFV.TableLinkId = AT.Id WHERE UDFV.Userfield13Id = '5029' AND AT.Code = '" & c.Value & "'")
If Not rs.EOF Then
sht.Cells(c.Row, "L").CopyFromRecordset rs
With sht.Range(sht.Cells(c.Row, "A"), sht.Cells(c.Row, LCol)).Font
.ThemeColor = xlThemeColorDark1
.TintAndShade = -0.349986266670736
End With
rs.Close
End If
End If
Next c
'code...
End Sub
【问题讨论】:
-
有很多选项。不要将您的 Excel 行视为特别的东西。它们只是数据。如果你在 SQL 上有 dbo,你可以在那里链接/导入你的数据(可能是最快的)。如果没有,您能否将 Excel 和 SQL 数据加载到内存中,处理所有内容并将其转储出来。不要使用手动色调和阴影,使用条件格式。循环并不是让你变慢的原因,它不断循环回 SQL 并写入 Excel。如果(有 10k 行)这需要大约 30 秒以上,您需要进行优化。
-
@Gareth 请写一个答案,会有所帮助。至于 CF,我特别选择了:它需要是非动态格式
-
您确实需要对该语句进行参数化。 SQL 注入仍然即使是现在在业界也是一个太大的问题,它不应该是。沙盒、开发工作、学校项目等并非“免疫”参数化;现在养成编写不仅仅是一个巨大的安全漏洞的代码的习惯,然后在将来你编写的东西如果它有一个巨大的漏洞就会“重要”时,它就不会成为问题。
-
@Larnu 我同意,但从未练习过保存 SQL 注入(到目前为止还没有必要,因为连接是只读的,并且仅由公司内的一小部分用户使用)。如果你给我一个保存方法,我会很乐意实现它
标签: sql sql-server excel vba ado