sql – VBA新数据库连接

前端之家收集整理的这篇文章主要介绍了sql – VBA新数据库连接前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何更改下面的代码以防止您在屏幕截图中看到的内容.

我正在使用以下代码运行宏

  1. Dim conn As ADODB.Connection
  2. Dim rec1 As ADODB.Recordset
  3. Dim thissql As String
  4.  
  5. Set conn = New ADODB.Connection
  6.  
  7. Dim sConn As String
  8. sConn = "Provider=sqlOLEDB;Trusted_Connection=Yes;Server=xyz;Database=xyz;UID=xyz;PWD=xyz"
  9. conn.Open sConn
  10.  
  11. ' this is creating multiple connections.
  12. Set rec1 = New ADODB.Recordset
  13. rec1.Open thissql,conn

它运行sql Server查询(大约20行,包含4个连接).一切都很好,除了经过几次运行后我的数据库管理员说我的查询过多地加载了DB.

现在,我的查询可能导致问题,或者可能是Excel开始一次运行多个连接.对此的一些证据是下面的屏幕截图以及数据库上的负载似乎随时间增加的事实.

如何在不创建新连接的情况下建立数据库连接?

有没有人在使用Excel DB宏时遇到类似的问题?

UPDATE

虽然下面的答案非常有用(特别是对于以VBA开始的人),但似乎我的查询占用负载的主要原因是多个连接的组合并忽略了我的代码中的一行:

  1. With Sheets("FVols").QueryTables.Add(Connection:=rec1,Destination:=Sheets("FVols").Range("A1"))
  2. .name = "data"
  3. .FieldNames = True
  4. .Refresh BackgroundQuery:=True <<<<<<<<<<<<<<<<<<<<<<<-----
  5.  
  6. End With

解决方法

您只需要打开一次连接.这实际上意味着您可以在该活动连接上执行多个查询.您必须关闭连接并释放引用(特别是ADODB)以避免遇到冲突和其他与连接相关的问题.

如果您知道要执行的查询,则可以创建一个数组(或集合)并向队列添加查询.

虽然您已经有一个可以使用的开放连接,但您可以继续执行查询.

扫描代码,你和我之间没有太大区别,所以你应该能够看到发生了什么,在哪里.如果有任何不清楚的地方,请在评论中提问

  1. Sub DbConnection()
  2.  
  3. Dim cn As ADODB.Connection
  4. Set cn = New ADODB.Connection
  5. Dim rs As ADODB.Recordset
  6.  
  7. Dim strConn As String
  8. strConn = "Driver={sql Server};Server=; Database=; UID=; PWD="
  9.  
  10. cn.Open strConn
  11.  
  12. Dim queryArr,i
  13. queryArr = Array("SELECT * FROM [MyTable]","SELECT * FROM [MyOtherTable]")
  14.  
  15. For i = LBound(queryArr) To UBound(queryArr)
  16. ExecuteQuery queryArr(i),cn,rs
  17. Next i
  18.  
  19. cn.Close
  20. Set cn = Nothing
  21. End Sub
  22.  
  23. Private Sub ExecuteQuery(query As Variant,ByRef cn As ADODB.Connection,ByRef rs As ADODB.Recordset)
  24. Set rs = New ADODB.Recordset
  25. With rs
  26. .ActiveConnection = cn
  27. .Open CStr(query)
  28. Sheets(1).Range("A1").CopyFromRecordset rs
  29. .Close
  30. End With
  31. Set rs = Nothing
  32. End Sub

现在,您只需要执行一次DBConnection(),并且将执行您在数组中列出的所有查询.

或者,如果您的查询是在运行时创建的,则可以将其作为参数传递给DbConnection().

  1. Sub DbConnection(queryQueue As Collection)
  2.  
  3. Dim cn As ADODB.Connection
  4. Set cn = New ADODB.Connection
  5. Dim rs As ADODB.Recordset
  6.  
  7.  
  8. Dim strConn As String
  9. strConn = "Driver={sql Server};Server=HELIUM\PRI; Database=sourcedata; UID=tabula; PWD=Tabula123!"
  10.  
  11. cn.Open strConn
  12.  
  13. For i = 1 To queryQueue.Count
  14. ExecuteQuery queryQueue.Item(i),ByRef rs As ADODB.Recordset)
  15. Set rs = New ADODB.Recordset
  16. With rs
  17. .ActiveConnection = cn
  18. .Open CStr(query)
  19. Sheets(1).Range("A1").CopyFromRecordset rs
  20. .Close
  21. End With
  22. Set rs = Nothing
  23. End Sub

更新:

您可以将连接声明为全局变量.现在,您可以根据需要多次运行DBConnection(),并且每次都不会创建新连接.相反,您将使用全局连接对象.

  1. Option Explicit
  2.  
  3. Public cn As ADODB.Connection
  4.  
  5. Sub DbConnection()
  6.  
  7. Set cn = New ADODB.Connection
  8. Dim rs As ADODB.Recordset
  9.  
  10. Dim strConn As String
  11. strConn = "Driver={sql Server};Server=; Database=; UID=; PWD="
  12.  
  13. cn.Open strConn
  14.  
  15. Set rs = New ADODB.Recordset
  16. With rs
  17. .ActiveConnection = cn
  18. .Open "SELECT * FROM [MyTable]"
  19. Sheets(1).Range("A1").CopyFromRecordset rs
  20. .Close
  21. End With
  22. Set rs = Nothing
  23.  
  24. cn.Close
  25. Set cn = Nothing
  26. End Sub

猜你在找的MsSQL相关文章