Xl加载项(VBA)和持久对象

时间:2014-04-23 03:11:07

标签: excel vba excel-vba adodb excel-addins

我正在为XL 2010/2013编写一个加载项,它通过ADODB.Connection对象使用数据库连接。我尝试以各种方式声明对象,以便它在加载项的使用之间保持不变,但到目前为止无济于事。

目标是在启动时初始化连接并在此期间保持此连接。当触发加载项工作簿的Open事件时,初始化代码运行正常,建立连接并且我有一个ADODB.Connection对象。当序列完成控制时,如您所期望的那样返回XL。单步执行代码表明它都按预期工作。然后将在Workbook_BeforeClose事件处理程序中处理ADODB.Connection对象。

当用户尝试使用加载项的功能(在启动/初始化之后)利用数据库连接时,我们发现连接对象已经退出范围并且不再存在,即使设置为全局在标准模块中。我也尝试将其设置为工作簿代码模块中的公共变量/对象,但无济于事。

有没有办法在连续使用加载项之间保持连接对象(或任何对象)?

干杯

青蛙

PS:对于DB afficionados,谁会(通常正确地)指出维护连接不是最好的方法:在这种情况下,我需要是否喜欢它。后端(BE)使用许多临时表,需要在使用外接程序的不同功能之间保留。


答案


托尼,你做对了,我还没把它放在正确的地方。

问题的答案如下:

1 /您需要声明一个将为您返回连接对象的函数:

Function cn() As ADODB.Connection

Static mCon As ADODB.Connection

On Error Resume Next                                            'Better way to handle?

If mCon Is Nothing _
   Or mCon.State = adStateClosed Then                           'exists? connected?

    Set mCon = New ADODB.Connection                             'create anew
    mCon.Open getConnectionString                               'open the connection
    Debug.Print "Connection attempted"

    If mCon.State = adStateOpen Then Connected = True
End If
Set cn = mCon
End Function

2 /声明'工作'连接对象为静态,如上面的代码

3 /使用函数的名称代替连接对象。在这种情况下,该函数被称为' cn'。你可以使用' cn'就像你直接声明对象并直接调用它一样。使用该函数,您将获得智能感知和所有其他正常对象属性和方法(如果您拥有存储过程,则使用它)。

例如/ Debug.Print cn.ConnectionString将调用该函数并返回底层ADODB.Connection对象属性的连接字符串。

4 /我使用了一个函数来生成名为' getConnectionString'的连接字符串。 - 你可以硬编码或自己动手。它所做的就是为ADODB.Connection对象提供正确的连接字符串。打开方法调用。

5 /我有一个名为' Connected'的变量。我认为这将更好地发挥作用而不是全球化。即/写一个检查“状态”的函数。连接对象的属性并返回一个布尔值。

感谢Tony的帮助。好指针。

享受解决方案

干杯

青蛙

0 个答案:

没有答案