在ms访问中调用oracle存储过程而不通过查询保存密码

时间:2015-02-04 11:52:08

标签: vba ms-access access-vba ms-access-2003

我正在使用MS ACCESS 2003,我需要通过ms访问来调用oracle存储过程。我正在使用传递查询来调用该过程。我已经使用Microsoft驱动程序为ODBC创建了用户DSN,并成功调用了该过程。 的 ODBC; DSN = DSN_NAME; UID = USER_NAME; PWD = *******; DBQ = MY_SERVER

但我担心的是在传递查询中保存密码,有时密码更改,然后我必须每次更改传递查询的连接字符串。

有没有其他方法可以通过传递查询来调用该过程,而无需在密码更改时更改连接字符串,或者vba中是否有任何代码执行此操作。我正在寻找动态方式,其中调用过程将很容易,而无需通过转到其属性来更改每个传递查询的密码。 谢谢 !!

2 个答案:

答案 0 :(得分:1)

是的,这是可能的,但您需要知道或换句话说能够在您的应用程序中以某种方式检索密码。在生产线应用程序中,您将使用用户(登录)密码来创建连接字符串以访问后端表。

结构看起来与此相似:

  1. 创建一个模块来托管与连接相关的公共功能。
  2. 创建新函数GET_CONNECTION_STRING()as String:这将返回您的连接字符串,包括登录用户的密码。
  3. 遍历数据库中的表定义/查询定义并更新 .connect 属性。
  4. 在大多数情况下,您可以更改.connect属性并使用.RefreshLink手动刷新/连接。
  5. 您需要添加新引用才能使用DAO对象。 (Microsoft dao objets,或者activex数据对象或ado对象,无论您要使用哪种类型)
  6. 一些启动代码:

    dim db  as dao.database
    set db = currentdb
    dim tdf as dao.tabledef
    
    For Each tdf In db.TableDefs
        If tdf.connect <> vbNullString Then
            tdf.connect = GET_CONNECTION_STRING & ";TABLE=" & tdf.name
            'if you want to manually refresh uncomment below line
            'tdf.refreshlink
            End If
        End If
    Next tdf
    

    将以上函数添加到启动宏将确保使用最新的连接字符串更新所有链接表(您需要执行额外的查询)。

    尝试在遇到困难时发布您的代码。

答案 1 :(得分:1)

任何链接表和在Access中包含“已保存”传递要求的表不需要在该字符串中包含密码。如果省略密码,那么对Oracle数据库的单一登录将允许所有链接表并通过quires运行并且无需密码即可运行。

第一步是将表设置为DSN less,并且不要包含密码(您最好删除现有的链接表)。

要使用上面的链接,但不包括密码意味着您首先必须执行登录到数据库。完成后,您可以链接您的表和传递quires。所以表格的一次性链接作为DSN较少而且你不参加比赛。

完成上述操作后,任何和所有连接(包括传递查询)都可以正常工作,而无需包含用户名。

上述意味着您不必为登录数据库的不同用户重新链接。

要运行传递查询,您可以使用这一行VBA代码:

CurrentDb.Execute.QueryDefs(&#34; MyPassQuery&#34)。执行

此处概述了如何与无DNS连接: http://www.accessmvp.com/djsteele/DSNLessLinks.html

如何“缓存”用户登录,并且不要求链接连接中的用户+登录或用于传递的用户+登录在此处概述:

电源提示:提高数据库连接的安全性

http://blogs.office.com/b/microsoft-access/archive/2011/04/08/power-tip-improve-the-security-of-database-connections.aspx

因此,您可以在启动时执行一次登录,或者提示用户进行登录,并从应用程序的那一点开始,然后传递 - =尽管查询将在不需要密码的情况下运行。而这个ALSO意味着您可以让不同的用户登录,而不必重新链接现有的表(以及传递quires)。