0

我的问题不是专门寻找解决方案的想法,而是更多地检查我自己的解决方案的完整性,因为我在 Excel VBA 中使用 ADODB 已经有一段时间了(至少有两个主要修订版)。

所以情况是这样的。我正在为想要访问大块数据库视图的用户创建一个 Excel 报表,该数据库视图太大而无法放入内存。用户需要能够访问所有视图,因此硬编码过滤器是不可能的。除非我错过了一个更优雅的解决方案,否则他们需要的是能够以生成的 SQL 语句的形式动态控制连接上的过滤器,该语句输入到数据透视缓存中,然后告诉数据透视表刷新。

我创建了一个“刷新”按钮,它会显示一个包含用户通常需要的所有过滤器的表单。用户输入过滤器值,我解析并验证它们,从这些值中形成适当的 SQL 语句。然后我在执行此操作时遇到问题:

'this has to be dynamic becuase I'm distributing to multiple users, using different testing/production databases on different workstations.
mypivottable.PivotCache.Connection = "ODBC;" & driver & myserver & myuser & trusted & app & workstationid & databse

'this also has to be dynamic becuase of the sql filters
mypivottable.PivotCache.CommandText = sql

所以我按下按钮,它就起作用了!设置这些属性后,数据透视表会自动刷新,因为它知道缓存后面有新数据,并在新条件下获取查询结果。

问题是,当我查看外部数据源列表时,每次更改这些属性时,它都会创建一个新连接并且不会自行清理。使用 100 次后,周围有 100 个连接,其中 99 个未使用。如果我删除所有连接,那么它会不可逆转地破坏数据透视表。

有一个更好的方法吗?有没有一种编程方式来只清理未使用的连接?

4

1 回答 1

1

如果您需要做的只是更新 SQL 语句,则不必重置连接。我实际上有一个类似的问题,这就是我解决它的方法:

Sub test()
' add logic...

    ' then change sql code
    With ThisWorkbook.Connections("your connection name").OLEDBConnection
            .CommandText = Array("select * from mytable where id = 1") ' adjust accordingly
            .Refresh
    End With
End Sub

您真正需要做的就是获取当前连接,然后更新 CommandText 属性。顺便说一句,我不确定我为什么需要使用Array(),但没有它我会遇到问题。

实际上,我写了一篇关于使用 SQL 创建数据透视表的博客文章(链接在这里)。也许我应该再写一篇关于创建动态内容的文章:)

于 2013-03-22T00:42:24.557 回答