2013-03-21 126 views
0

我的问题不是专门寻找解决方案的想法,更多的是对我自己的解决方案进行完整性检查,因为我已经工作了一段时间(至少有两个主要修订版) Excel VBA中的ADODB。数据透视表动态查询到外部数据源

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

我创建了一个“刷新”按钮,它将显示一个窗体,其中包含用户通常需要的所有过滤器。用户输入过滤器值,我解析并验证它们,从这些值中形成适当的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 

因此,我按下按钮,它的工作原理!设置这些属性后,pivottable将自动刷新,因为它知道缓存后面有新数据,并根据新条件提取查询结果。

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

有没有更好的方法来做到这一点?是否有程序化的方法来清理未使用的连接?

回答

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创建数据透视表(link here)的博客文章。也许我应该做出另一个关于创建动态内容:)